2009-09-17 42 views

回答

79

第一次訪問該類時。

Static Constructors (C# Programming Guide)

靜態構造用於初始化任何靜態數據,或者執行需要僅一次執行的特定動作。它在創建第一個實例或引用任何靜態成員之前自動調用。

+0

謝謝,這是有道理的,當我正確思考它! – Jason 2009-09-17 08:10:03

+5

有趣的是,它表示「在創建第一個實例或引用任何靜態成員之前」。當它實際被調用時,在*有一些餘地。 – 2011-05-13 10:20:25

+5

@TimBarrass由於規範的某些其他要求,「之前」實際上是「之前」 - 請參閱Jon Skeet的文章在其他答案中引用 - http://stackoverflow.com/a/1437372/477420 – 2015-09-12 05:01:07

34

儘管直截了當的文檔,它並不像你所期望的那麼簡單。 Jon Skeet的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx詳細討論了這個問題。

總結:

靜態構造是保證將第一參考該類別的成員之前立即執行- 無論是創建實例或類的自己的靜態方法/屬性的。

請注意,在第一次參考特定字段之前,保證在任何時間執行靜態初始化器(如果沒有靜態構造函數)

+0

+1。打倒我,但只是。 ;) – AnthonyWJones 2009-09-17 08:04:47

+0

這是非常有趣的閱讀,謝謝男士們。 – Jason 2009-09-17 08:10:48

+0

提到的文章現在在Jon Skeet的網站上:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy 2014-07-23 09:10:27

17

在您使用類中的任何內容之前調用靜態構造函數,但是在發生這種情況時的確切時間取決於實現。

保證在第一個靜態成員被訪問之前和第一個實例被創建之前被調用。如果這個類從未被使用過,那麼靜態構造函數就不能保證被調用。

+2

發生時*如果該實現遵循ECMA C#規範,則*不是「實現」:「靜態構造函數的執行是由在應用程序域內發生下列第一個事件觸發的:[1]該類的實例被創建。[2]引用該類的任何靜態成員。「 (第17.11節,http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH 2009-09-17 09:16:10

+0

@Luke:「靜態構造函數執行的確切時間是依賴於實現的」http://ondotnet.com /酒吧/ A/DOTNET/2003/07/07/staticxtor。html – Guffa 2009-09-17 10:12:44

+2

@Guffa:這可能是文章作者的解釋,但是你不會在Microsoft或ECMA/ISO版本的C#規範中找到這種措辭。 – LukeH 2009-09-17 10:37:04

0

如果從父類調用靜態方法,則不會調用靜態構造函數,而是明確指定它。這裏是一個例子,如果b.methoda()被調用,b構造函數不會被調用。

static void Main(string[] args) 
{ 
    b.methoda(); 
} 

class a 
{ 
    public static void methoda() 
    { 
     //using initialized method data 
    } 
} 

class b : a 
{ 
    static b() 
    { 
     //some initialization 
    } 
}  
相關問題