當咱們想初始化一些靜態變量的時候,就須要用到靜態構造函數了。這個靜態構造函數屬於類,而不屬於實例,就是說這個構造函數只會被執行一次,即:在建立第一個實例或引用任何靜態成員以前,由.NET自動調用。函數
如今碰到這樣一個場景:提供一個靜態方法,這個靜態方法在不一樣的地方使用,涉及到一個參數值不一樣,而其餘內容都徹底一致。若是是將靜態方法的內容複製出來作成另一個方法,代碼冗餘太多,作法不可取。使用靜態構造函數處理靜態變量,則能夠盡最大程度簡化代碼。以下示例:spa
/// <summary> /// 基類 /// </summary> public class A { public static string Field = "original-test"; //靜態構造函數 static A() { Field = "test-a"; } public static void Test() { Console.WriteLine("the output is : " + Field); } } /// <summary> /// 子類 /// </summary> public class B : A { //靜態構造函數 static B() { Field = "test-b"; } public static new void Test() { A.Test();//調用基類方法,這個對基類Test函數的覆蓋很重要,沒有這個,那麼調用B.Test()的時候實際上是調用基類的Test方法。
} }
如代碼所示,類型B繼承於基類型A。B中的靜態構造函數對靜態變量Field進行賦值,這個會在調用子類中的Test方法以前調用,而B中Test方法的實現則是徹底調用基類A的Test方法,這樣,在方法執行的時候,方法中使用的靜態變量Field的值就是在B的靜態構造函數中賦值以後的test-b。code
調用結果以下:blog
static void Main(string[] args) { A.Test();//輸出the output is : test-a B.Test();//輸出the output is : test-b Console.ReadLine(); }
A.Test()調用,Field值爲test-a;而B.Test()調用,Field值爲test-b。繼承
這樣,當靜態方法的實現邏輯複雜的時候,就能夠針對須要將這個方法進行個性化實現的需求的時候簡化代碼:子類在靜態構造函數中對靜態變量從新賦值,而後從新實現基類中的靜態方法。string
(注意,後面的從新實現基類中的靜態方法是必須的,不然輸出B.Test()的時候,調用基類的Test()方法,使用的Field變量則是基類中的變量,那時輸出則變成以下:)it
static void Main(string[] args) { A.Test();//輸出the output is : test-a B.Test();//輸出the output is : test-a。由於沒有覆蓋子類方法,等同於A.Test() Console.ReadLine(); }