2016-03-29 4 views
0

このオーバーロードされたコンストラクタは、シングルトンパターンを作成するためのインターフェイスとして自分自身を持っているようです。これはシングルトンパターンですか?

普通のコンストラクタイディオムはC#ですか?

class clDBaccess 
{ 

    // private field 
    private readonly string conn; 


    public clDBaccess() 
    : this(ConfigurationManager.ConnectionStrings["foo"].ConnectionString) 
    { 
    } 
    public clDBaccess(string connectionString) 
    { 
    this.conn = connectionString; 
    } 
    ... 
    ... 
+0

ので、ここでhttp://stackoverflow.com/questions/17034475/in-c-sharp-what-c​​ategory-受け入れ答えの第二のスニペットによると、のように見えますコロンは、継承やインターフェースがあることをコンパイラーに通知するのではなく、単に他のコンストラクターを実行するように指示するのではありません。他の受け入れられた答えがそうであることを示唆しているように見えるのは、そうです、_itはイディオムです。 – whytheq

答えて

8

Singletonパターンは、一度これまで呼び出されるコンストラクタを持っています。これは、パラメータのないコンストラクタに適切なデフォルトを提供するためのメソッドオーバーロードです。

コンストラクタを呼び出して、必要な数だけインスタンスを作成できます。したがって、シングルトンではありません。

6

いいえここでのデフォルトのコンストラクタは、接続文字列fooapp.configから使用すると便利です。このクラスの複数のインスタンスが作成されるのを防ぐことはできませんが、デフォルトのコンストラクタを使用してそれらを作成すると、同じデータベースに接続します(ただし、必ずしも同じ接続を共有するわけではありません)。これを行うには

一つの理由は、connプロパティがreadonlyであるということです - それは、コンストラクタで初期化する必要があります(とコンストラクタが実行された後に変更することはできません)、およびそのデフォルトコンストラクタはmeanigfulからそれを初期化しようとヌルまたはstring.Emptyに設定するのではなく、設定します。

6

いいえ、任意のシングルトンには保護されたコンストラクタが必要です。

using System; 

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 
+3

「保護されたコンストラクタ」の必要性について言及してから、「プライベートコンストラクタ」を使用するのが面白いと思います。 – zzzzBov

+3

プライベートは保護されたものよりも保護されています。どちらもまだ保護されています。 – Eric

+1

この静的な揮発性の揮発性シングルトンインスタンスを使用します。 https://msdn.microsoft.com/en-us/library/ff650316.aspxこのリンクに記載されているようにhttps://msdn.microsoft.com/en-us/library/x13ttww7.aspx – rashfmnb

3

「シングルトン」しかクラスのインスタンスがあることを意味しています。通常、そのクラスの単一インスタンスを返すpublic staticプロパティがあります。

クラスを複数回インスタンス化できないようにするには、コンストラクタを通常はプライベートにします。

ここには該当しません。 2つのコンストラクタを持つ通常のクラスです。パラメータのないコンストラクタは、有用なデフォルト値を持つ優先コンストラクタに「リダイレクト」します。

1

いいえ、シングルトンパターンには適合しません。オブジェクトのインスタンス化がクラス自体によって制御されるように、コンストラクタはプライベートである必要があります。例えば

public class Singleton 
{ 
    private Singleton() 
    { 
    } 
    private static Singleton instance = new Singleton(); 
    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 
関連する問題