問題1:什麼是.NET框架?解釋一下它的關鍵組成部分?
答:.NET框架是一個全面的環境,它允許開發人員編寫、編譯、執行和部署應用程式。這些應用程式可以是多種型別,如控制檯應用程式,Windows應用程式,Web應用程式,WCF, WPF等。
.NET框架支援多種程式語言,包括C#、VB.NET、VC++。
.NET框架有如下兩個關鍵元件:
CLR(Common Language Runtime 公共語言執行庫)FCL(Framework Class Library 框架類庫)或BCL(Base Class Library 基類庫)CLR作為應用程式虛擬機器,提供各種服務,如記憶體管理、安全、異常處理、型別安全、執行緒管理等。
另一方面,FCL提供了一組與資料訪問、密碼學、通訊、數學、演算法和應用開發等相關的API。
問題2:什麼是IL?我們能把IL程式碼轉換回原始碼嗎?
答:IL,或中間語言,也稱為MSIL(微軟中間語言),.NET框架附帶了所有.NET支援語言的編譯器。當我們編譯原始碼時,它被轉換成IL,IL程式碼是所有程式語言的通用程式碼。
IL然後由即時(JIT)編譯器轉換為機器程式碼或本機程式碼。
邏輯流程可以如下所示。
C#/VB Code -----------------------> MSIL (Byte code) ------------------------>Machine/Native code.
是的,我們可以將IL程式碼轉換為原始碼,或者使用.NET提供的免費工具ILDASM,或者使用其他第三方工具,如Reflector或IL spy等。
問題3:什麼是CTS(Common Type System 公共型別系統)和CLS(Common Language Specification 公共語言規範),兩者有何聯絡?
答:公共型別系統(CTS)是CLR不可或缺的一部分,.NET框架透過它提供了對多種程式語言的支援。CTS提供了一種跨所有語言通用的系統型別。因此,兩種CTS相容的語言可以呼叫彼此的程式碼,而不需要任何型別的轉換。例如,integer和float變數的大小在所有相容.NET的程式語言中是一樣的。
話雖如此,每種語言都可以為CTS提供的公共或基本資料型別使用別名。例如,對於CTS型別int32, C#使用別名作為int, VB使用整數,然而在這兩種語言中,它將表示4位元組整數值。
CLS或公共語言規範是一組規則,每種語言都必須遵循這些規則才能與.NET相容。CLS是CTS的一部分,它支援兩種相容.NET的語言之間的互操作性,因此CLS支援的語言可以使用彼此的程式碼或類庫。
問題4:託管(Managed Code)和非託管程式碼(Unmanaged Code)分別代表什麼含義?
答:託管程式碼是由CLR而不是作業系統執行的程式碼,編譯器首先將託管程式碼編譯為中間語言程式碼。此程式碼與配置無關,因此可以在不同的機器上執行。
另一方面,非託管程式碼是在CLR環境或作業系統之外執行的程式碼,它直接編譯為本機程式碼或機器程式碼,因此取決於機器配置。
由CLR處理的託管程式碼可以獲得開箱即用的服務,如自動記憶體管理、安全性、型別檢查和異常處理等。這些服務有助於在以任何.NET支援的語言開發的託管程式碼應用程式中提供一致性。
而在非託管程式碼中,開發人員必須關心記憶體的分配、安全性和型別安全性等,在非託管程式碼(ActiveX元件、Win32 APIs等)中處理記憶體時的任何遺漏都可能導致記憶體洩漏。
問題5:垃圾收集是如何工作的?並解釋它的每一代?
答:一旦垃圾收集器被CLR初始化,它將獲得一部分記憶體來儲存和管理被稱為託管堆的物件。
每個託管程序獲得自己的堆,程序中的所有執行緒使用分配給其程序的相同堆,堆分為小物件堆和大物件堆兩種型別(> 85 KB),這些堆被進一步組織成代,以處理短期和長期存在的物件。
堆有3代物件,即第0代、第1代和第2代。最初,新建立的物件被分配到第0代,並且基於它們的壽命,它們繼續移動到後續的代。下面是關於每個生成堆的詳細資訊。
第0代:這是最早的一代,包含壽命較短的物件,短期物件的一個例子是臨時變數,垃圾收集在這一代中發生得最頻繁。第1代:這代主要包含從第0代升級而來的物件,它們的壽命介於短期物件和長期物件之間。第2代:這代是儲存生命週期最長的物件。長生命週期物件的一個例子是伺服器應用程式中的物件,該物件包含在程序持續期間處於活動狀態的靜態資料。當情況需要時,垃圾回收會自動發生,或者透過如下命令手動進行:
System.GC.Collect(): 強制所有代立即進行垃圾收集System.GC.Collect(int generation): 強制從第0代到指定代立即進行垃圾收集System.GC.Collect (int generation, GCCollectionMode mode)這裡的生成可以是0、1或2,GCCollectionModecan可以是預設/強制/最佳化的,預設是強制的。
問題6:說明“Dispose”和“Finalize”的區別?
答:GC只釋放託管資源。為了釋放檔案、資料庫連線、網路連線、COM等非託管資源,. net框架提供了Finalize和Dispose方法。
Dispose:
Dispose用於確定地清除非託管資源,開發人員需要透過實現IDisposable介面來顯式呼叫它。
Finalize:
Finalize用於對非託管資源進行不確定的清理,GC在類中定義解構函式時呼叫它。
要記住的幾點:
開發人員應該傾向於處理它,因為它在大多數情況下都可以工作,而且不會對效能產生任何影響。
當您不確定是否正確地處理了所有物件,並希望確保當例項不再被應用程式引用時,Finalize只是一種非常罕見的情況下的額外保護措施。
當使用Dispose, call GC.SuppressFinalize方法以避免重複操作。
問題7:什麼是CAS(Code Access Security 程式碼訪問安全)?在.NET 4中有哪些改進?
.NET Framework 4簡化了安全系統,並進行了重大改變。
從.NET Framework 4開始,下面的修改開始生效。
安全策略已棄用,但許可權仍在使用。應用程式程式碼分為以下幾類。安全關鍵程式碼(安全或可信程式碼)
安全透明程式碼(不安全程式碼)
安全關鍵程式碼(安全關鍵程式碼和透明程式碼之間的橋樑)
許可權由應用程式域建立的授予集決定。所有部分信任的應用程式都被分類為透明的。桌面和本地內部網應用程式被授予完全信任。如何啟用CAS
在.NET Framework < 4.0要開啟/關閉安全性,在命令提示符下輸入以下命令:
caspol -security on
caspol -security off
在.NET Framework 4.0和更高版本中使用Caspol.exe,在此之前,首先需要將<legacycaspolicy>元素設定為true。問題8:在.NET框架中JIT編譯器的角色是什麼?
回答:JIT編譯器是CLR的一個重要元件,它將MSIL載入到目標機器上執行。JIT編譯器使用目標機器的CPU架構將MSIL程式碼轉換為本機程式碼,以執行.NET應用程式。
JIT編譯器還在.NET框架的執行時環境中強制型別安全。例如,它檢查傳遞給任何方法引數的值。
問題9:什麼是託管的可擴充套件性框架?
回答:託管可擴充套件性框架(MEF)是.NET 4.0中引入的一個新庫,它提供了更好的應用程式和元件重用.MEF提供了一種簡單的方式來託管應用程式,從而在不需要任何配置的情況下使用外部擴充套件。
問題10:解釋記憶體對映檔案?這些檔案有何好處?
回答:記憶體對映檔案(MMFs)是一種特殊的檔案,允許您將檔案的內容對映到應用程式的邏輯地址。這些檔案使同一臺機器上的多個程序能夠彼此共享資料。
MemoryMappedFile.CreateFromFile方法用於從磁碟上的檔案獲取MemoryMappedFile物件,該物件表示持久化的記憶體對映檔案。
該特性在System.IO中可用System.IO.MemoryMappedFiles名稱空間,其中存在一組類和列舉,以幫助訪問和保護檔案對映。
記憶體對映檔案的好處如下:
更好的I/O效能,因為更改是就地完成的延遲載入,因為只有檔案的必要部分需要載入到RAM中,在處理大檔案時很有用記憶體對映檔案能夠在多個程序之間共享資料