C#代碼編譯過程:
C#源碼 =>
C#編譯器轉(zhuǎn)換為公共中間語言(Common Intermediate Language,CIL)=>
CIL代碼被公共語言運(yùn)行庫(Common Language Runtime,CLR)轉(zhuǎn)換為機(jī)器碼(JIT)
1.托管代碼
托管代碼是在公共語言運(yùn)行庫中運(yùn)行的代碼,托管代碼的執(zhí)行由公共語言運(yùn)行庫來直接控制,而不是操作系統(tǒng)來直接控制。具體而言,由公共語言運(yùn)行庫中的代碼管理器來控制和執(zhí)行托管代碼,而公共語言運(yùn)行庫的其他部分會(huì)提供托管代碼執(zhí)行時(shí)所需要的各種服務(wù),如垃圾回收、類型檢查、安全支持等。
2.非托管代碼
非托管代碼是在托管代碼的概念出現(xiàn)后相對(duì)于托管代碼而言的,其實(shí)際上是計(jì)算機(jī)操縱系統(tǒng)可識(shí)別的機(jī)器碼。非托管代碼(機(jī)器碼)的執(zhí)行由操作系統(tǒng)來控制,其在執(zhí)行時(shí)也需要各種服務(wù),如垃圾回收、類型檢查、安全支持等。由于沒有像公共語言運(yùn)行庫這樣的東西會(huì)自動(dòng)給你提供服務(wù),所以你需要自己提供這些服務(wù),也就說你要寫額外的代碼來實(shí)現(xiàn)垃圾回收等功能。
托管類型:C#內(nèi)置類型
非托管類型:
如果某個(gè)類型是以下類型之一,則它是非托管類型 :
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool
任何枚舉類型
任何指針類型
任何用戶定義的 struct 類型,只包含非托管類型的字段,并且在 C# 7.3 及更早版本中,不是構(gòu)造類型(包含至少一個(gè)類型參數(shù)的類型)