2011-05-01 64 views
1

可能重複:
Why doesn't the CLR always call value type constructors類型的靜態構造函數調用

發現旁邊的代碼里氏的書(我已經簡化它一點點):

internal struct SomeValType 
{ 
    static SomeValType() 
    { 
     Console.WriteLine("This never gets displayed"); 
    } 
    public Int32 X; 
} 

public sealed class Program 
{ 
    public static void Main() 
    { 
     SomeValType a = new SomeValType { X = 123 }; 
     Console.WriteLine(a.X); 
    } 
} 

輸出:

無法理解,爲什麼在WriteLine靜態構造函數調用NEVEL。看着ILDasm - 構造函數代碼和方法調用都存在。如果我將任何靜態變量添加到SomeValType並在構造函數中初始化,然後WriteLine調用正確。

有人可以解釋,請在這種情況下的行爲?謝謝。

+0

我試着讓X靜態並在構造函數中賦值。這使得控制檯輸出按預期顯示。同樣的事情發生,如果我完全刪除X並投入在Main()中調用的靜態方法。也許不調用靜態構造函數,除非調用/訪問靜態方法或成員? – 2011-05-01 10:29:48

回答

1

可能因爲您從未訪問過構造函數真實也不是靜態字段。

值類型的默認構造函數是特殊的。這只是一個初始化爲二進制的所有字段的默認值(即二進制的0整個結構)

1

MSDN

  • 靜態構造函數被調用 自動初始化 [重點煤礦] 創建第一個實例之前 或引用任何靜態成員。

看來,這個詞類是這裏的關鍵。如上所述創建類型的第一個實例時,使SomeValType成爲類會導致靜態構造函數的調用。然而,當它是一個結構體時,您似乎需要訪問一個靜態字段或調用一個靜態方法來觸發此行爲。這是一個錯誤還是它的目的?