2011-11-27 88 views
11

下面的代碼:爲什麼靜態字段初始化發生在靜態構造函數之前?

static void Main(string[] args) 
{ 
    Console.WriteLine("0"); 
    string h = Foo.X; 
    Console.WriteLine("2"); 
} 

public static class Foo 
{ 
    public static string X = ((Func<string, string>)delegate(string g) 
    { 
     Console.WriteLine(g); 
     return (g); 
    })("_aaa"); 

    static Foo() 
    { 
     Console.WriteLine("ctor"); 
    } 
} 

會打印:

0 
_aaa 
ctor 
2 

我知道的beforefieldinit行爲(有/無靜態構造函數等)。

明白的事情是爲什麼ctor(輸出)是_aaa後?

它沒有任何意義,如果我想在構造函數中初始化變量呢?

問題

爲什麼的X初始化是ctor過嗎?

+0

當然,非靜態字段和非靜態構造函數類似:class Foo {public string X =「A」; public Foo(){X =「B」; }}'如果你做了'(new Foo())。X',你得到''B'',而不是''A'',因爲''B''的賦值最後發生了(覆蓋了第一個值)。 –

+0

@JeppeStigNielsen感謝您的澄清 –

回答

17

原因ctor是字段初始值設定項之後的原因,因爲這是它指定的方式。從C#規範(重點是礦):

10.5.5.1靜態字段初始化一個類的靜態字段變量初始化對應於指派的序列 在文本順序執行它們出現在類別 聲明。 如果該類中存在靜態構造函數(第10.12節),則執行靜態字段初始值設定項會立即在執行該靜態構造函數之前執行 。否則,靜態字段 初始化正在以實現相關的時間之前 第一次使用這個類的靜態字段的執行

如果您希望您的初始化順序的總量控制,將它全部在構造函數中。

+0

非常感謝... –

相關問題