2012-11-06 11 views
9

私はこれをたくさん探しましたが、答えは明らかではありません(私にとっては少なくとも!)。今私は他の場所でもっと明確な答えを得ることができないと信じているので、この質問をしています。プライベートvs .Netの静的コンストラクタ

私のクラスでプライベート/静的コンストラクタを使用する必要があるのはいつですか?

私は通常の回答にうんざりしていますので、これらのコンストラクタを使用するといくつかのリアルタイムの例と利点/欠点を教えてください。

+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

静的コンストラクタを使用してプライベートコンストラクタを呼び出すこともできます。静的な関数/プロパティよりもこのメンバを返すことができるので、そのようなオブジェクトのインスタンスは常に1つだけです - シングルトン。 – jwaliszko

3

静的コンストラクタは、クラスの静的メンバをintializeするために使用され、クラスの最初のインスタンスが作成されるか、または静的メンバーが最初にアクセスされたときに呼び出されます。あなたは、コンストラクタのオーバーロードを使用している場合

プライベートコンストラクタが使用されている、と私は私のクラスでプライベートコンストラクタを使用する必要がある場合は、それらのいくつかは、他の唯一のコンストラクタ

8

で使用する必要がありますか?

コンストラクタが必要なときに、コンストラクタをワールドに公開したくないとき。これは、コンストラクタを呼び出すファクトリメソッド(検証後)があるか、またはそのコンストラクタがctor-chaining(つまりpublic Foo(string) : this() { ...})によって呼び出されている可能性があります。

また、リフレクションコードでは、プライベートコンストラクタ(シリアル化やORMライブラリなど)を使用できることがよくあります。

また、初期のC#コンパイラでは、プライベートコンストラクタを持つstaticクラスを作成するときに、それが作成不能に見えるようにする唯一の方法でした。

私のクラスではいつ静的コンストラクタを使用する必要がありますか?

インスタンスまたは静的メソッドによってアクセスされる前に、ある静的状態を初期化する必要がある場合。

関連する問題