先看個例子:
using System;
Class A
{
static int X;
static A()
{
X = B.Y + 1;
}
}
Class B
{
public static int Y = A.X + 1;
static B() {}
static void Main()
{
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
執行結果是X=1,Y=2
這個例子主要考查2個方面,一是static的用法,二是static的初始化順序。瞭解了static的初始化順序和規則,這個問題答答案就很容易理解了。這裡涉及到以下三類static對象:static成員,static方法,static建構函式。規則如下:
一個類的static建構函式在給定的應用程式定義域中僅執行一次。static建構函式由在應用程式定義域的下列事件的首次發生時觸發:
1)該類的執行個體被建立。
2)任何一個static成員被引用
3)如果類包含執行入口Main方法,此類的static建構函式在Main方法被調用之前執行。
4)如果類包含任何staic成員,則這些static成員在static建構函式之前進行初始化。
5)如果類包含任何static方法,則這些static方法在static建構函式之後進行初始化。
6)對於存在多個static成員,他們的初始化將按照文本順序進行,不會因為調用順序而改變。
現在看看上面的應用程式,Class B中有個Main執行入口,所以B首先得到初始化,順序是static成員Y->static建構函式。在初始化Y時,引用了A.X,編譯器又開始初始化Class A(注意這時Class B的初始化並沒有完成),順序也是static成員X->static建構函式。Class A中X在定義的時候沒有被賦予初始值(在定義static變數時,盡量賦予初始值),編譯器會預設賦予值0(int型)。然後再執行static的建構函式,由於Class B的初始化這時還沒有完成,所以B.Y的值在這時被編譯器賦予預設值0,所以在A的static的建構函式執行完後,X的值變為1,然後返回B繼續完成初始化,得到Y的值為2。最後執行Main,輸出A.X和B.Y的值。相反地,如果將B中的Main方法移出放在一個類C中,那執行結果又是什麼呢?依據以上的規則,可以很方便的得出答案。