我知道靜態構造函數和私有構造函數以及何時使用它們的區別。但是,什麼時候應該將靜態構造函數設置爲private,以及這樣做的優點是什麼?何時以及爲什麼應該將靜態構造函數設置爲私有?
回答
private
關鍵字在C#中實際上沒有做任何事情。默認情況下,一切已經是private
,除了非嵌套類型internal
,因爲它們不能是private
。
這幾天我從來沒有使用private
關鍵字,它只是噪音。
注意:這僅適用於C#。在Visual Basic中,默認的可見性不是很理智,你需要在適當的地方明確地使用Private
。
_這些天我從不使用private關鍵字_我有完全相反的行爲:)我儘可能地使用'private'。 – 2014-09-04 06:53:50
哦,不要誤解我的意思,我仍然儘可能地私下討論。我只是沒有看到關鍵字本身的需要。這樣想:讓它私有是免費的,公開要求輸入一些東西。 – 2014-09-04 06:57:11
我輸入private,因爲它在代碼審閱者和QA人員的開發團隊中促進了更好的代碼可讀性。 E.g.我的QA傢伙是一個通過我的C#的java傢伙。他不知道C#將它們默認爲私有。因此,我將它們標記爲私人視覺是一件好事,因爲他明白這一點很明顯。 我堅信只要看代碼,儘可能多的信息應該可以被獲得。例如。一個私有方法應該被標記爲私有方法,並且它應該有一個以這種方式命名的名稱,這很明顯是該方法的作用。我在地區很大。 – 2014-09-04 07:03:28
靜態構造函數應該始終是私有的。
爲什麼?
通常,即使在創建該類的第一個實例之前,框架也會調用靜態構造函數。這創建了一種可以隨時使用的單一實例。
但是,如果構造函數不是私有的,則意味着其他對象也可以創建該實例。這可能會導致意外的行爲。
所以,靜態構造函數應該總是私有的。
C#中的靜態構造函數不允許使用訪問修飾符,它們(總是)總是公共的,這意味着框架可以隨時訪問它們以執行特定於類型的初始化。將public
或private
添加到靜態構造函數將不會編譯。
A private
構造函數總是一個實例私有構造函數,這是一個不同的事情,並且在創建單例時最常用,以防止通過用戶代碼顯式實例化類。
請注意,從客戶端代碼的角度來看,它們既不公開也不私密。你永遠不能自己調用一個靜態構造函數,所以public和private在這種情況下是不相關的。另外,您實際上並不能控制CLR何時決定調用它(在嘗試實例化您的自己或者訪問該類的任何靜態成員之前,它肯定總會發生)。 – Groo 2014-09-04 07:14:45
- 1. 什麼時候應該將構造函數設置爲constexpr?
- 2. PHP |爲什麼我應該使用公共靜態/私有靜態函數而不是公共/私有函數?
- 3. (C++)在靜態類中做什麼更好:將構造函數設置爲私有還是公共刪除?
- 4. 爲什麼要將原型的構造函數設置爲其構造函數?
- 5. 爲什麼枚舉可以包含私有構造函數?
- 6. 爲什麼序列化可以訪問私有構造函數?
- 7. 爲什麼私有靜態屬性爲
- 8. 爲什麼有一個私有構造
- 9. 爲什麼一個靜態構造沒有任何參數
- 10. 爲什麼在靜態轉換之後調用構造函數?
- 11. 爲什麼我們需要一個私有構造函數?
- 12. 靜態構造函數的行爲(C#)
- 13. 爲什麼基礎構造函數在靜態上下文中?如何應對?
- 14. 靜態構造函數和私有構造函數之間的主要區別是什麼?
- 15. 對於C++中的靜態類(帶有私有構造函數),我應該定義一個析構函數嗎?
- 16. 靜態構造函數如何變成非私有的?
- 17. 靜態對象如何調用私有構造函數
- 18. 爲什麼我要將私有構造函數與靜態嵌套類結合起來?
- 19. 爲什麼以及何時刪除拷貝構造函數和operator =
- 20. 應該將私有內部類的構造函數聲明爲public還是private?
- 21. 爲什麼System.Data.SqlClient.SqlDataReader沒有構造函數
- 22. 具有靜態方法和私有構造函數的final類?
- 23. 爲什麼我不能將類構造函數參數設置爲默認值?
- 24. 什麼時候使用私有構造函數有用?
- 25. 爲什麼不是構造函數設置一個參數?
- 26. 何時以及爲什麼要在Ruby中使用Loop構造
- 27. Python包中需要什麼以及它應該如何構造?
- 28. 爲什麼我可以從全局範圍調用私有構造函數?
- 29. 任何原因爲什麼日誌字段應該是私有靜態的?
- 30. 在C#中繼承的私有靜態和實例變量以及爲什麼?
@TimSchmelter除了IL以外,是否有任何編程語言允許您不使其變爲私有? – 2014-09-04 06:52:37
沒有其他語言的「afaik」(在.net中)允許您不要將它們設爲私有。該規則是編譯器強制的,每個.Net框架語言都依賴這個規則。另外,我想不出有一個人需要做一個公開的單一理由。 如果您需要能夠再次運行它的初始化邏輯,請使用靜態構造函數調用的名爲Initialize的靜態方法。用戶可以重新調用初始化方法。 – 2014-09-04 06:59:31