0. 機器碼 直接由機器碼對應平臺的CPU執行的指令集, 所以沒法在其餘指令集的CPU上運行. 沒法跨平臺. 由本地代碼編譯獲得. (託管代碼經過JIT生成)html
1. 字節碼 即 bytecode 是一種中間碼. 通常由JIT編譯器解釋編譯成機器碼再在本機上執行. 能夠跨平臺.程序員
2. CLR = 公共語言運行庫CLR (Common Language Runtime) .net 框架下多種語言的統一運行框架(虛擬機). 和Java VM 類型的運行時環境. 至關於全部的.net 語言(C#, VB.NET, ASP之類的) 的底層引擎. 能夠協調這類語言的統一運行機制.算法
框架能夠把上述語言都轉換爲IL(中間語言 Intermediate Language). 而後再由JIT編譯器(Just In Time Complier 即時編譯器) 邊執行邊解釋編譯成機器碼執行. 從而造成大一統的環境, 實現運行時根據平臺編譯生成機器碼的跨平臺的特性.編程
圖片From http://www.javashuo.com/article/p-oyulijzo-et.html安全
3. IL(中間語言 Intermediate Language) 一種用於 .net框架下全部語言統一轉化獲得的語言. 能夠由JIT解釋執行, 實現跨平臺. 如上述連接框架
4. 託管代碼 = managed code = 公共語言運行庫CLR (Common Language Runtime) 環境下執行的代碼, 基於.net framework的代碼. 受CLR的託管. 不須要程序員關心GC之類的內容.ide
通俗說就是.net平臺下的開發, 都屬於託管代碼. 好比咱們寫的Unity的C#. 編譯結果是bytecode(字節碼)函數
優勢: 程序猿不須要關心GC, 指針之類的頭疼事情, 有豐富的封裝, 框架提供的類庫之類的.工具
缺點: 有便利就失去了靈活性和自主性, 嚴格按規矩辦事. 學會和各類.net框架版本友好相處.性能
5. 非託管代碼 = Native Code = 本地代碼 即: 沒有.net虛擬機(或者JVM) 管理執行的代碼. 編譯結果是特定平臺的機器碼. 不能一次編譯跨平臺執行. 每一個平臺須要單獨編譯.
直接由OS執行. 由程序員本身管理(GC等), 直接和OS打交道的開發. 好比咱們寫的C++ Native DLL.
https://baike.baidu.com/item/native/13128691
https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81
優勢: 運行效率高. 高度靈活性, 高度自治, 執行各類底層操做. 只有想不到, 沒有作不到.(依賴OS)
缺點: 刀尖上跳舞, 注意安全. 須要工具本身造(找).
6. unsafe = 不安全代碼 = .net 託管代碼中實現一些CLR不支持的(沒法管理, 不保證安全), 非託管代碼纔有的功能. 好比指針. 必須用unsafe關鍵字包起來纔可使用.用於告訴CLR和程序員本身, 這塊代碼是非安全的.
不安全代碼並非說"不安全", 只是從設計者(程序員)的角度來看是清楚的, 安全的. 必須用關鍵字包起來是避免程序員無心識間使用到了非安全的編碼方式.
也能夠標識出非安全的代碼段, 提供一些非安全的編程特性(fixed). 避免CLR按管理通常託管代碼的方式去管理該段代碼, 引發不符合程序員的設計思路的後果.
也許是爲了實現CLR類型安全的目標吧,默認狀況下,C#沒有提供指針的使用算法,可是有些狀況下也可能須要指針這樣直接訪問內存的東西(雖然目前我尚未用過),可是有時候程序員很是清楚程序的運行情況,須要使用指針直接訪問內存以便於提升性能或者調試、監控程序運行的內存的使用情況,以便於採起相應的措施。還有一些狀況是當咱們須要調用外面DLL中的函數又不能使用DllImport 時,也須要指針來傳遞這些函數。
引用自:http://www.javashuo.com/article/p-guxjjqbm-em.html
Unsafe code is in fact a "safe" feature from the perspective of both developers and users. Unsafe code must be clearly marked with the modifier unsafe
, so developers can't possibly use unsafe features accidentally, and the execution engine works to ensure that unsafe code cannot be executed in an untrusted environment.
引用自: MS DOC: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/unsafe-code
7. fixed = 固定變量, 鎖定指針對應變量的內存地址, 避免CLR GC移動該變量的位置.
fixed 語句設置指向託管變量的指針,並在執行該語句期間"固定"此變量。這樣就能夠防止變量的重定位
引用自:http://www.javashuo.com/article/p-guxjjqbm-em.html