CLR基礎

CLR(Common Language Runtime)可以說是.NET的核心,它管理着垃圾收集,代碼安全驗證等重要內容。 要想查看自己電腦上裝了哪些版本的CLR,MS 的.NET SDK2.0 中有一個工具叫:CLRVer.exe 運行這個工具在加上-all開關,即可查看。

我們知道c#的編譯器有兩種模式:Debug和Release,這兩種模式對IL代碼和最終的本地代碼的優化是不一樣的。例如在Debug模式下,我們用ILDasm查看IL代碼會看見裏面有好多的NOP指令,就是控操作的意思,爲了方便調試用。但是Release下卻沒有這些指令。

Compiler Switch Settings                            C# IL Code Quality                JIT Native Code Quality
/optimize- /debug- (this is the default)       Unoptimized                          Optimized
/optimize- /debug(+/full/pdbonly)                Unoptimized                          Unoptimized
/optimize+ /debug (-/+/full /pdbonly)          Optimized                               Optimized

以上就是不同的設置對代碼產生的不同影響。

我們知道c#去掉了指針的功能,不能直接操作內存,其實這樣說不太準確。只能說是C#不推薦大家使用指針。但是並沒有真正的消除指針。大家可以在方法前加上unsafe關鍵字,並且在項目的屬性裏面選擇允許不安全代碼運行,就可以正常使用指針。但是帶來的一些不安全因素由自己負責。

.NET的類庫非常龐大,下面介紹幾個最基礎的:

System                                                    包含每個應用程序都要使用的全部基本類型
System.Data                                            包含用於數據庫通訊和數據處理的類型
System.Drawing                                       包含處理2D圖形的類型
System.IO                                                包含用於執行流IO操作和瀏覽目錄文件的類型
System.Net                                              包含一些網路通訊和Internet通訊的類型
System.Runtime.InteropServices              包含與非託管平臺互操作的類型
System.Security                                        包含保護數據和資源的類型
System.Text                                               包含處理採用各種編碼方式的文件的類型
System.Threading                                     包含異步操作和同步資源訪問的類型
System.Xml                                               包含用於處理XML框架的類型

下面我們用張圖說明一下CTS,CLS,CLR以及C#,VB.NET等之間的關係

我們可以看到CTS是最大的集合,它描述了類型的定義及行爲方式。而CLS它詳細定義了一個最小特徵子集。CLR/CTS支持的特性要比CLS多了很多。而C#,VB.NET等是微軟在CTS下的一個實現。你自己也可定義語言,只要它實現了CLS並且符合CTS就可以在.NET運行。當然編譯器自己寫了....如果要想使用CTS的所有特性,只有只使用IL代碼寫程序纔可以。然後使用ILAsm工具,把IL代碼編譯成可執行文件運行。不過這可不是一般人能夠做到的。要想檢查程序集是否與CLS兼容,可以在命名空間前加上[assembly:CLSCompliant(true)]這個特性,編譯器在編譯的時候就會檢查兼容性。

下面看個例子:

using System;

[assembly: CLSCompliant(
true)]
namespace SomeLibrary {

public sealed class SomeLibraryType {

public UInt32 Abc() return 0; }

public void abc() { }

private UInt32 ABC() return 0; }
}

}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章