一、clr的fcl、cts和cls
1. clr為common language runtime,為微軟.net framework的公共語言執行時。
2. cts為common type system(通用型別系統),其是微軟制定的乙個正式的規範來描述型別的定義和行為,使得一種程式語言寫的**能和另一種程式語言進行溝通。
cts規定,乙個型別可以包括0個或者多個成員。
同時,cts指定型別可見性規則和型別成員的訪問規則:
3. cls為common language specification(公共語言規範),其定義了乙個最小功能集,任何編譯器只有支援此功能集,才可以相容其他符合cls、面向clr的語言生成的元件。
二、c#的靜態類和靜態成員
靜態類與非靜態類基本相同,但存在乙個區別:靜態類不能例項化。也就是說,不能使用 new 關鍵字建立靜態類型別的變數。因為沒有例項變數,所以要使用類名本身訪問靜態類的成員。例如,如果名為 utilityclass 的靜態類有乙個名為 methoda 的公共方法,則按下面的示例所示呼叫該方法:
utilityclass.methoda();
對於只對輸入引數進行運算而不獲取或設定任何內部例項欄位的方法集,靜態類可以方便地用作這些方法集的容器。例如,在 .net framework 類庫中,靜態類 systemmath 包含的方法只執行數**算,而無需儲存或檢索特定 math 類例項特有的資料。就是說,通過指定類名稱和方法名稱來應用類成員,如下示例所述。
double dub = -3.14;console.writeline(math.abs(dub));
console.writeline(math.floor(dub));
console.writeline(math.round(math.abs(dub)));
//output:
//-4
//3
和所有類型別一樣,當載入引用靜態類的程式時,.net framework 公共語言執行時 (clr) 將載入該靜態類的型別資訊。程式不能指定載入靜態類的確切時間。但是,可以保證在程式中首次引用該類前載入該類,並初始化該類的字段並呼叫其靜態建構函式。靜態建構函式僅呼叫一次,在程式駐留的應用程式域的生存期內,靜態類一直保留在記憶體中。
若要建立僅允許建立乙個自身例項的非靜態類,請參見 implementing singleton in c#(在 c# 中實現單一例項)。
靜態類的主要特性:
因此,建立靜態類與建立僅包含靜態成員和私有建構函式的類基本相同。私有建構函式阻止類被例項化。使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地新增例項成員。編譯器將保證不會建立此類的例項。
靜態類是密封的,因此不可被繼承。它們不能從除 object 外的任何類中繼承。靜態類不能包含例項建構函式,但可以包含靜態建構函式。如果非靜態類包含需要進行重要的初始化的靜態成員,也應定義靜態建構函式。
非靜態類可以包含靜態的方法、字段、屬性或事件。即使沒有建立類的例項,也可以呼叫該類中的靜態成員。始終通過類名而不是例項名稱訪問靜態成員。無論對乙個類建立多少個例項,它的靜態成員都只有乙個副本。靜態方法和屬性不能訪問其包含型別中的非靜態欄位和事件,並且不能訪問任何物件的例項變數(除非在方法引數中顯式傳遞)。
更常見的做法是宣告具有一些靜態成員的非靜態類,而不是將整個類宣告為靜態類。
靜態欄位有兩個常見的用法:一是記錄已例項化物件的個數,二是儲存必須在所有例項之間共享的值。
靜態方法可以被過載但不能被重寫,因為它們屬於類,不屬於類的任何例項。
雖然字段不能宣告為 static const,但 const 欄位的行為在本質上是靜態的。這樣的字段屬於型別,不屬於型別的例項。因此,可以同對待靜態字段一樣使用 classname.membername 表示法來訪問 const 字段。不需要物件例項。
c# 不支援靜態區域性變數(在方法範圍內宣告的變數)。
通過在成員的返回型別之前使用 static 關鍵字可以宣告靜態類成員,如下面的示例所示:
publicclass
automobile
}public
static
drive()
public
static
event
eventtype runoutofgas;
//other non-static fields and properties...
}
靜態成員在第一次被訪問之前並且在呼叫靜態建構函式(如有存在)之前進行初始化。若要訪問靜態類成員,應使用類名而不是變數名來指定該成員的位置,如下面的示例所示:
automobile.drive();i = automobile.numberofwheels;
如果類包含靜態字段,請提供在載入類時初始化這些欄位的靜態建構函式。
對靜態方法的呼叫以 microsoft 中間語言 (msil) 生成呼叫指令,而對例項方法的呼叫生成 callvirt 指令,該指令還檢查 null 物件引用。但是,兩者之間的效能差異在大多數時候並不明顯。
重溫CLR(一)CLR基礎
如果乙個c developer,對clr沒有了解,那就只能是入門級別。未來.net core是趨勢,但是.net core 也是基於coreclr的,而clr和coreclr其實差別不大,從runtime那部分看幾乎沒有區別,程序管理,gc,jit這些基本上是一樣的。clr vie c 這本書很久之...
25執行緒基礎 CLR
由clr via c 第三版 摘抄記錄.1 執行緒是cpu的虛擬化,windows為每個程序提供專用線程 cpu 2 執行緒開銷 記憶體和時間。執行緒核心物件 os為系統中建立的每個執行緒都分配並初始化這種資料結構之一。其中包含對執行緒進行描述的屬性,和上下文。上下文是記憶體塊,x86的是約700位...
CLR筆記 4 型別基礎
4.1 所有型別都派生自system.object system.object提供的方法 gettype tostring gethashcode equals memberwiseclone finalize 所有物件都是用new操作符建立,建立過程 1.計算物件大小,包括 型別物件指標 和 同步...