上一篇補習了類和方法,這一篇補習下類中一些靜態成員和常量。
以下是本文所要介紹的內容:
1、靜態建構函式
2、靜態成員與常量
一、靜態建構函式
前段時間經常看到園子裡有朋友發麵試題,其中比較有代表性的就是靜態建構函式了,有興趣的朋友可以搜尋下看看,我這邊也就順便補習下靜態建構函式的知識:
1、靜態建構函式永遠優先與其他建構函式。
2、靜態建構函式是在首次訪問所在類的第一個成員時進行的,並且只會執行一次。
3、靜態建構函式沒有參數,不需要任何存取修飾詞,有.NET runtime運行。
4、類中一旦包含靜態建構函式,那麼編譯器會自動插入一段檢查代碼負責檢查所有靜態成員和構造,以確保其優先運行。
所以在瞭解了以上知識後再看下面的代碼就會清楚很多:
class Class1 { public static string str = "fsdafdsa"; public static readonly Class1 anobject = new Class1(); static Class1() { System.Console.WriteLine("靜態建構函式調用"); } private Class1() { } public static Class1 c() { return new Class1(); } }static void Main(string[] args) { string s = Class1.str; Class1 temp =Class1.c(); Console.WriteLine("程式開始"); Console.ReadLine(); }
結果輸出時,字串“靜態建構函式調用”會第一個被輸出,這是因為string s = Class1.str; 這句代碼已經訪問了類中的成員了,符合上面的第2條。
二、靜態成員與常量
對於類來說,一個類中可以包含許多成員,而且大部分成員都可以是靜態,比如:變數、屬性、方法等。同樣需要注意的有以下幾點:
1、如果不包含靜態建構函式,那麼靜態欄位會在訪問類的任何靜態欄位時候進行初始化及賦值。
2、除非需要訪問一個靜態欄位,否則不必對靜態成員進行初始化。
3、對於靜態類,在IL的最終標記為abstract和sealed。
在為欄位設定是否為常量(const)或唯讀(readonly)時,需要注意:
1、const常量會在編譯時間就固定,所以常量建議是不會更改的變數,否則如果一旦發生更改且沒有重新編譯那麼程式訪問的還是老的值,所以對於可能會更改的值還是設定為readonly。
2、當將變數數組設定為readonly的時候,其數組的長度是無法更改的,但是其中的值是可以更改的。
3、應用了readonly的變數可以在建構函式中對其變更。