當我有包含一個靜態構造函數的類時,該構造函數在包含該類的程序集第一次加載時或當該類的第一個引用被命中時調用?什麼時候是在C#中調用的靜態構造函數?
回答
第一次訪問該類時。
Static Constructors (C# Programming Guide)
靜態構造用於初始化任何靜態數據,或者執行需要僅一次執行的特定動作。它在創建第一個實例或引用任何靜態成員之前自動調用。
儘管直截了當的文檔,它並不像你所期望的那麼簡單。 Jon Skeet的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx詳細討論了這個問題。
總結:
靜態構造是保證將第一參考該類別的成員之前立即執行- 無論是創建實例或類的自己的靜態方法/屬性的。
請注意,在第一次參考特定字段之前,保證在任何時間執行靜態初始化器(如果沒有靜態構造函數)。
+1。打倒我,但只是。 ;) – AnthonyWJones 2009-09-17 08:04:47
這是非常有趣的閱讀,謝謝男士們。 – Jason 2009-09-17 08:10:48
提到的文章現在在Jon Skeet的網站上:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy 2014-07-23 09:10:27
在您使用類中的任何內容之前調用靜態構造函數,但是在發生這種情況時的確切時間取決於實現。
保證在第一個靜態成員被訪問之前和第一個實例被創建之前被調用。如果這個類從未被使用過,那麼靜態構造函數就不能保證被調用。
發生時*如果該實現遵循ECMA C#規範,則*不是「實現」:「靜態構造函數的執行是由在應用程序域內發生下列第一個事件觸發的:[1]該類的實例被創建。[2]引用該類的任何靜態成員。「 (第17.11節,http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH 2009-09-17 09:16:10
@Luke:「靜態構造函數執行的確切時間是依賴於實現的」http://ondotnet.com /酒吧/ A/DOTNET/2003/07/07/staticxtor。html – Guffa 2009-09-17 10:12:44
@Guffa:這可能是文章作者的解釋,但是你不會在Microsoft或ECMA/ISO版本的C#規範中找到這種措辭。 – LukeH 2009-09-17 10:37:04
如果從父類調用靜態方法,則不會調用靜態構造函數,而是明確指定它。這裏是一個例子,如果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
}
}
- 1. C#中外部靜態構造函數的用途是什麼?
- 2. 什麼時候注入構造函數,什麼時候是CDI
- 3. 基礎構造函數調用的靜態是什麼?
- 4. C++什麼時候運行靜態分配的對象的構造函數
- 5. C#中的靜態構造函數究竟是什麼?
- 6. 什麼時候在嵌套類中調用構造函數(Java)
- 7. 什麼時候在cpp中調用拷貝構造函數?
- 8. 什麼是複製構造函數,什麼時候應該在C#中使用?
- 9. 總是調用靜態構造函數
- 10. 什麼時候在C++中使用'new'運算符調用構造函數?
- 11. 什麼時候調用SignalR中心構造函數?
- 12. 爲什麼在靜態轉換之後調用構造函數?
- 13. 什麼時候在C++中生成默認構造函數
- 14. 什麼時候在C++中調用析構函數?
- 15. C中的靜態構造函數
- 16. 什麼時候需要從構造函數調用`super`?
- 17. Objective C靜態構造函數與動態構造函數
- 18. 靜態構造函數的用途是什麼?
- 19. 顯式調用靜態構造函數
- 20. 非靜態類中靜態構造函數的功能是什麼?
- 21. 調用父類和子類的靜態構造函數的順序是什麼?
- 22. 靜態構造函數的行爲(C#)
- 23. 爲什麼在包含類的構造函數之前調用靜態成員的構造函數?
- 24. C#實例構造函數與靜態構造函數
- 25. 什麼時候使用構造函數,何時使用OnInit
- 26. Java - 構造函數是靜態的嗎?
- 27. 零參數構造函數有什麼好處?什麼時候是理想的?
- 28. 未被調用的C++模板靜態成員構造函數
- 29. 模仿C++靜態構造函數
- 30. C++靜態庫和構造函數
謝謝,這是有道理的,當我正確思考它! – Jason 2009-09-17 08:10:03
有趣的是,它表示「在創建第一個實例或引用任何靜態成員之前」。當它實際被調用時,在*有一些餘地。 – 2011-05-13 10:20:25
@TimBarrass由於規範的某些其他要求,「之前」實際上是「之前」 - 請參閱Jon Skeet的文章在其他答案中引用 - http://stackoverflow.com/a/1437372/477420 – 2015-09-12 05:01:07