2014-09-04 45 views
2

我知道靜態構造函數和私有構造函數以及何時使用它們的區別。但是,什麼時候應該將靜態構造函數設置爲private,以及這樣做的優點是什麼?何時以及爲什麼應該將靜態構造函數設置爲私有?

+0

@TimSchmelter除了IL以外,是否有任何編程語言允許您不使其變爲私有? – 2014-09-04 06:52:37

+1

沒有其他語言的「afaik」(在.net中)允許您不要將它們設爲私有。該規則是編譯器強制的,每個.Net框架語言都依賴這個規則。另外,我想不出有一個人需要做一個公開的單一理由。 如果您需要能夠再次運行它的初始化邏輯,請使用靜態構造函數調用的名爲Initialize的靜態方法。用戶可以重新調用初始化方法。 – 2014-09-04 06:59:31

回答

0

private關鍵字在C#中實際上沒有做任何事情。默認情況下,一切已經是private,除了非嵌套類型internal,因爲它們不能是private

這幾天我從來沒有使用private關鍵字,它只是噪音。

注意:這僅適用於C#。在Visual Basic中,默認的可見性不是很理智,你需要在適當的地方明確地使用Private

+4

_這些天我從不使用private關鍵字_我有完全相反的行爲:)我儘可能地使用'private'。 – 2014-09-04 06:53:50

+1

哦,不要誤解我的意思,我仍然儘可能地私下討論。我只是沒有看到關鍵字本身的需要。這樣想:讓它私有是免費的,公開要求輸入一些東西。 – 2014-09-04 06:57:11

+1

我輸入private,因爲它在代碼審閱者和QA人員的開發團隊中促進了更好的代碼可讀性。 E.g.我的QA傢伙是一個通過我的C#的java傢伙。他不知道C#將它們默認爲私有。因此,我將它們標記爲私人視覺是一件好事,因爲他明白這一點很明顯。 我堅信只要看代碼,儘可能多的信息應該可以被獲得。例如。一個私有方法應該被標記爲私有方法,並且它應該有一個以這種方式命名的名稱,這很明顯是該方法的作用。我在地區很大。 – 2014-09-04 07:03:28

1

靜態構造函數應該始終是私有的。

爲什麼?

通常,即使在創建該類的第一個實例之前,框架也會調用靜態構造函數。這創建了一種可以隨時使用的單一實例。

但是,如果構造函數不是私有的,則意味着其他對象也可以創建該實例。這可能會導致意外的行爲。

所以,靜態構造函數應該總是私有的。

+1

我不確定你的意思是*「如果構造函數不是私有的,則意味着其他對象也可以創建實例」*。你在談論靜態或實例構造函數嗎?如果你在談論實例構造函數,我不知道如何使它公開可能會導致意外的行爲。而靜態構造函數不能被其他對象調用,所以我也不明白。 – Groo 2014-09-04 07:19:01

+0

我的意思是靜態構造函數。道歉失去清晰度 – 2014-09-04 07:20:30

+0

-1。靜態構造函數*只能是私有的*或者它不會被編譯。靜態構造函數不會創建實例。 – Rawling 2014-09-04 07:42:57

2

C#中的靜態構造函數不允許使用訪問修飾符,它們(總是)總是公共的,這意味着框架可以隨時訪問它們以執行特定於類型的初始化。將publicprivate添加到靜態構造函數將不會編譯。

A private構造函數總是一個實例私有構造函數,這是一個不同的事情,並且在創建單例時最常用,以防止通過用戶代碼顯式實例化類。

+0

請注意,從客戶端代碼的角度來看,它們既不公開也不私密。你永遠不能自己調用​​一個靜態構造函數,所以public和private在這種情況下是不相關的。另外,您實際上並不能控制CLR何時決定調用它(在嘗試實例化您的自己或者訪問該類的任何靜態成員之前,它肯定總會發生)。 – Groo 2014-09-04 07:14:45

相關問題