2013-07-31 118 views
3

我正在閱讀埃裏克的博客系列的靜態構造函數和想到的是,作爲實例構造函數可以重載,爲什麼靜態構造函數不能被重載? 背後沒有提供相同的原因是什麼?靜態構造函數重載?

+0

Eric的博客maby有任何鏈接嗎? (: – dotixx

+0

誰是埃裏克?他的博客鏈接將幫助我們更好地理解你的問題。 – Renan

+2

參數來自哪裏? –

回答

5

靜態構造函數不能帶參數。這意味着您不能創建防止過載的不同方法簽名。

+0

我知道它不能接受一個參數,但爲什麼會這樣呢,保持這個原因的主要原因是什麼,爲什麼不呢? –

+1

@ user2639248:因爲你可以*不*永遠直接調用靜態構造函數;它是由運行時爲你完成的,這就是爲什麼它可以*不能*取一個參數,請參見[答案](http:// stackover flow.com/a/17978042/45914)。 – jason

16

因爲你可以從來沒有直接調用靜態構造函數;它總是由運行時隱式地爲你完成。因此,您不能將參數傳遞給靜態構造函數;因此,唯一可能的靜態構造函數是具有默認參數的構造函數。

+0

當然,但我們可以想象,可以改變說:手動調用靜態構造器?添加和缺點? – Toto

+0

我喜歡你的回答 –

+0

@Toto:不,你不想考慮手動調用靜態構造函數的可能性。它是由語言設計的,在需要之前執行*精確*一次*。您*需要*該功能。使它手動,運行時不能再保證。 – jason

2

問「爲什麼」一種特定的語言特徵被設計成這種方式常常導致意見問題,這就是爲什麼這些類型的問題在堆棧溢出時不鼓勵的原因。也就是說,即使這只是一個意見問題,有時候一個答案可以導致更深入的理解。明白,我是而不是在C#開發團隊或任何附屬於微軟,所以你可以採取我的答案一粒鹽。

靜態構造函數的工作是初始化類所需的任何靜態數據的功能。 C#的設計是這樣的,靜態構造函數是保證在創建類的任何實例之前,以及在調用任何靜態方法或訪問靜態屬性之前執行。

用這種方式編寫簡單的程序很容易,看起來您可以手動進行保證 - 通過使應用程序調用靜態構造函數作爲它的第一件事情之一。但是它並不需要一個非常複雜的程序來確保在第一次使用類的實例之前調用所有靜態構造函數是很困難的。

例如,假設您包含名爲Foo的第三方組件,該組件具有靜態構造函數。爲了使用它,您的應用程序必須在執行任何其他操作之前調用Foo靜態構造函數。並且Foo構造函數將不得不寫入,以便它爲每個使用的類調用靜態構造函數。如果Foo靜態構造函數和Bar靜態構造函數都必須確保調用Frob靜態構造函數,會發生什麼情況?在你的場景中,第二個叫它的那個肯定會拋出一個異常。

你可能移動的責任主程序,使其調用靜態構造函數FooBar之前要求Frob靜態構造函數,但隨後每類的靜態構造函數必須是public,你的代碼將除了一些你關心的課程需要它之外,你完全不需要知道靜態構造函數的調用。

這聽起來不像是一個非常友好的設計給我。

如果您的靜態構造函數需要一個參數,請將該參數放在應用程序配置文件中或從命令行獲取。我強烈建議不要創建手動調用的單獨Initialize方法,主要是因爲很難確保在需要時調用此類方法。有關更多信息,請參閱Be careful with static classes,其中包含一些信息鏈接。

所以在我看來,靜態構造函數的工作方式是因爲這是在語言的整體設計中唯一有道理的方法。

如果你正在尋找的是一個單身......呃,這是另一回事。我建議Jon Skeet的Implementing the Singleton Pattern in C#