2012-11-06 76 views
9

我搜索了很多,但沒有一個答案是清晰的(至少對我來說!)。現在我正在把這個問題放在SO裏,因爲我相信我無法在其他地方得到更清晰的答案。.Net中的Private vs Static構造函數

什麼時候應該在我的課程中使用私有/靜態構造函數?

我厭倦了常見的答案,所以請幫助我一些實時示例和使用這些構造函數的優點/缺點。

+4

私人構造函數 - 如果您不希望您的對象可以從當前類的外部構造。靜態構造函數 - 如果你需要初始化靜態類的狀態。 – zerkms

回答

17

靜態構造函數:用於初始化靜態成員。

私有構造函數:當您只希望在自己的代碼中實例化一個類時(通常是靜態方法)時使用。例如:

public class Thing 
{ 
    static int Number; 

    static Thing() 
    { 
     Number = 42; // This will only be called once, no matter how many instances of the class are created 
    } 

    // This method is the only means for external code to get a new Thing 
    public static Thing GetNewThing() 
    { 
     return new Thing(); 
    } 

    // This constructor can only be called from within the class. 
    private Thing() 
    { 
    } 
} 
+4

您可以通過這種方式實現工廠模式 - 也就是說,如果您的業務對象需要處於特定的「狀態」,但您希望阻止第三方/其他開發人員使用公共構造函數初始化它們,則可以使構造函數爲私有,並提供一組工廠方法來創建/獲取對象。這樣他們就不能通過構造函數獲得一個'空白'無狀態對象(除非他們真的想要例如反射) – Charleh

+1

靜態構造函數也可以用來調用私有構造函數,該構造函數繼而實例化包含類類型的私有靜態成員。比靜態函數/屬性可以返回這個成員,所以總是隻有一個這樣的對象的實例 - 單身。 – jwaliszko

3
靜態

構造用於並初始化類的靜態成員和創建的類的第一個實例或靜態成員是第一次訪問時被調用。如果你有構造函數的重載

私有構造被使用,其中一些只能由其他構造

8

我應該什麼時候在我的課堂上使用私有構造函數中使用?

當你想要一個構造函數,但不想將它暴露給世界。這可能是因爲您有一個調用構造函數的工廠方法(在驗證之後),或者因爲構造函數是通過鏈接調用的(即public Foo(string) : this() { ...})。

此外,請注意,反射代碼通常能夠使用私有構造函數 - 例如序列化或ORM庫。另外,在早期的C#編譯器中,當你正在編寫現在是static類的時候 - 有一個私有構造函數是使它看起來不可取的唯一方法。

什麼時候應該在我的類中使用靜態構造函數?

當您需要在實例或靜態方法訪問該狀態之前初始化某個靜態狀態時。