我正在閱讀埃裏克的博客系列的靜態構造函數和想到的是,作爲實例構造函數可以重載,爲什麼靜態構造函數不能被重載? 背後沒有提供相同的原因是什麼?靜態構造函數重載?
回答
靜態構造函數不能帶參數。這意味着您不能創建防止過載的不同方法簽名。
我知道它不能接受一個參數,但爲什麼會這樣呢,保持這個原因的主要原因是什麼,爲什麼不呢? –
@ user2639248:因爲你可以*不*永遠直接調用靜態構造函數;它是由運行時爲你完成的,這就是爲什麼它可以*不能*取一個參數,請參見[答案](http:// stackover flow.com/a/17978042/45914)。 – jason
問「爲什麼」一種特定的語言特徵被設計成這種方式常常導致意見問題,這就是爲什麼這些類型的問題在堆棧溢出時不鼓勵的原因。也就是說,即使這只是一個意見問題,有時候一個答案可以導致更深入的理解。明白,我是而不是在C#開發團隊或任何附屬於微軟,所以你可以採取我的答案一粒鹽。
靜態構造函數的工作是初始化類所需的任何靜態數據的功能。 C#的設計是這樣的,靜態構造函數是保證在創建類的任何實例之前,以及在調用任何靜態方法或訪問靜態屬性之前執行。
用這種方式編寫簡單的程序很容易,看起來您可以手動進行保證 - 通過使應用程序調用靜態構造函數作爲它的第一件事情之一。但是它並不需要一個非常複雜的程序來確保在第一次使用類的實例之前調用所有靜態構造函數是很困難的。
例如,假設您包含名爲Foo
的第三方組件,該組件具有靜態構造函數。爲了使用它,您的應用程序必須在執行任何其他操作之前調用Foo
靜態構造函數。並且Foo
構造函數將不得不寫入,以便它爲每個使用的類調用靜態構造函數。如果Foo
靜態構造函數和Bar
靜態構造函數都必須確保調用Frob
靜態構造函數,會發生什麼情況?在你的場景中,第二個叫它的那個肯定會拋出一個異常。
你可能移動的責任主程序,使其調用靜態構造函數Foo
和Bar
之前要求Frob
靜態構造函數,但隨後每類的靜態構造函數必須是public
,你的代碼將除了一些你關心的課程需要它之外,你完全不需要知道靜態構造函數的調用。
這聽起來不像是一個非常友好的設計給我。
如果您的靜態構造函數需要一個參數,請將該參數放在應用程序配置文件中或從命令行獲取。我強烈建議不要創建手動調用的單獨Initialize
方法,主要是因爲很難確保在需要時調用此類方法。有關更多信息,請參閱Be careful with static classes,其中包含一些信息鏈接。
所以在我看來,靜態構造函數的工作方式是因爲這是在語言的整體設計中唯一有道理的方法。
如果你正在尋找的是一個單身......呃,這是另一回事。我建議Jon Skeet的Implementing the Singleton Pattern in C#。
- 1. Java - 靜態構造函數
- 2. Objective C靜態構造函數與動態構造函數
- 3. 構造函數和靜態函數
- 4. 重載構造映射構造函數
- 5. 公共構造函數和靜態構造函數
- 6. C#實例構造函數與靜態構造函數
- 7. C#構造函數重載
- 8. 構造函數重載
- 9. C#構造函數重載
- 10. 構造函數重載
- 11. 靜態構造函數有用
- 12. 靜態構造函數的創建[Mono.Cecil]
- 13. 來自靜態構造函數的Database.SetInitializer
- 14. 靜態導入和構造函數
- 15. 靜態構造函數和繼承
- 16. 跟蹤靜態構造函數執行
- 17. 靜態塊內的構造函數
- 18. 模仿C++靜態構造函數
- 19. C++靜態庫和構造函數
- 20. 靜態類C#構造函數OOP
- 21. 靜態構造函數之前反射
- 22. 總是調用靜態構造函數
- 23. 靜態構造函數,並用它
- 24. Assembly.GetCallingAssembly()和靜態構造函數?
- 25. asp.net的MVC - 靜態構造函數
- 26. C++線程靜態構造函數
- 27. 顯式調用靜態構造函數
- 28. VB.NET中的靜態構造函數
- 29. Database.SetInitializer()在靜態構造函數中?
- 30. 靜態構造函數和BeforeFieldInit?
Eric的博客maby有任何鏈接嗎? (: – dotixx
誰是埃裏克?他的博客鏈接將幫助我們更好地理解你的問題。 – Renan
參數來自哪裏? –