2012-07-02 69 views
13

訪問修飾符如public,private不允許使用C#中的靜態構造函數。但是,Visual Studio代碼分析在C#安全類別中有一個警告,指出「CA2121: Static constructors should be private」。靜態構造函數如何變成非私有的?

是否有可能使靜態構造函數非私有?或者是Visual Studio代碼分析的錯誤?

CLARIFICATION:我不想讓任何構造函數都是非私有的。所以爲什麼?」問題是無關緊要的。我只是對兩個微軟工具之間的矛盾感到好奇,並且想知道是否有任何我不知道如何處理靜態構造函數。

+0

以上鍊接引用:'用戶無法控制何時調用靜態構造函數。如果一個靜態構造函數不是私有的,它可以被系統以外的代碼調用。根據在構造函數中執行的操作,這可能會導致意外的行爲。「# – Tisho

+1

我認爲,相關的引用是」此規則由C#和Visual Basic .NET編譯器強制執行。「所以,不,你不能在C#中將它變成非私有的。 – Henrik

回答

9

C#靜態構造函數始終是私有的。您不應該看到C#代碼的警告,並且警告在那裏沒有用處。但是,代碼分析也適用於其他語言,並且這些語言可能會導致您使用非私有靜態構造函數編寫類。

+0

那麼爲什麼它被聲明適用於C#?你認爲那是錯誤嗎? –

+0

@ssg說明在哪裏? – hvd

+0

@ssg如果您指的是「此規則由C#和Visual Basic .NET編譯器強制執行。「在你的問題的評論中提到,那麼不,這意味着編譯器已經確保靜態構造函數是私有的,這意味着這個警告不應該觸發。 – hvd

3

如果你讀的文檔就明確指出

如果靜態構造函數是不是私人的,它可以通過不是系統代碼調用。根據在構造函數中執行的操作,這可能會導致意外的行爲。

我想更重要的問題是你爲什麼想要

+0

事情是,我做不到。編譯器會在我嘗試使用訪問修飾符前置靜態時引發錯誤。也許在IL級別上? –

+0

C#不允許cctor不是私有的,請參閱上面的Hendriks註釋。 – usr

+0

@ssg我會問你自己*爲什麼*你需要它是'private'以外的東西。我可以肯定地說,你的設計可能比C#團隊錯誤地使用非私有靜態構造函數更有可能是錯誤的。 – James

1

是否有可能使靜態構造函數不是私有的?

它是什麼意思?

靜態構造函數在類執行任何方法之前從鏈接器加載的時刻調用。因此,靜態構造函數在鏈接器的自動調用之外不能被調用,這意味着它沒有任何訪問修飾符的意義。

基本上,你不能引用沒有靜態修飾執行的類 - 並且在你的包含引用的代碼執行之前。

相關問題