最近,看到一道面試題,以下面試
class Class1 { private static int count = 0; static Class1() { count++; } public Class1() { count++; } } Class1 one = new Class1(); Class1 two = new Class1();
問程序執行完成之後,Class1.Count的值是多少。很顯然,考查的是對static關鍵字的基本認識,答案是3。函數
從程序的執行順序來講,第一次實例化類Class1時,先走靜態構造函數==>普通無參構造函數,第一次實例化Class1後,count的值爲2。spa
第二次實例化類Class1時,不會執行靜態構造函數,直接走無參構造函數,執行完後,count的值變爲3.code
若是此題答案正確,那麼請看下面的考題blog
class A { public static int X = B.Y; static A() { X++; } } class B { public static int Y=A.X; static B() { Y++; } }
請問 A.X=? B.Y=?get
A.X表示此時開始訪問A類,執行X=B.Y(此時先給其分配空間,並輔以0來初始化,而後調用對應的成員初始化語句來初始化這個靜態成員);string
B.Y表示開始訪問B類,執行Y=A.X(此時不是第一次訪問類型A,因此再也不進行靜態成員初始化和靜態構造函數的調用),此時,系統默認A.X=0; 既然訪問B類,就會執行B類的靜態構造函數,B類的構造函數執行完畢,此時Y=1,it
static int X=1,而後執行A類的靜態構造函數,執行完畢後,X=2,所以A.X=2。class
B.Y開始實例化B類。 可是B類的靜態字段與靜態構造函數已經執行了一次,不會再執行第二次A.X執行完畢後,Y已經等於1,所以B.Y=1。構造函數
所以,能夠了解到靜態字段以及靜態構造函在類被實例化時的一些特殊點:
一、靜態字段先於靜態構造函數被初始化,靜態構造函數在一個類中只有一個且不能帶有參數;
二、靜態成員初始化語句與靜態構造函數在指定的程序域中只會被執行一次,不論這個類被實例化多少次;
三、對於存在多個static成員,他們的初始化將按照文本順序進行,不會由於調用順序而改變。
那麼,靜態構造函數何時會被首次觸發呢?
一、該類的實例被建立;
二、任何一個static成員被引用。
class Class1 { private static Class1 obj = new Class1(); public static int counter1; public static int counter2 = 0; private Class1() { counter1++; counter2++; } public static Class1 getInstance() { return obj; } [STAThread] static void Main(string[] args) { Class1 obj = Class1.getInstance(); Console.WriteLine("Class1.counter1=="+Class1.counter1); Console.WriteLine("Class1.counter2=="+Class1.counter2); Console.Read(); } }
Design&Pattern 的 Singleton Pattern 的時候,由於靜態初始化是在 .NET 中實現 Singleton 的首選方法。