2012-05-06 12 views
4

Webを見て、私は(スレッドセーフな)シングルトン(C#で)を実装するこの単純なパターンを見てきました。シングルトン内のメンバー変数は静的として宣言する必要がありますか?

public sealed class MySingleton 
{ 
    private static readonly MySingleton _instance = new MySingleton(); 

    private string[] _data = new string[10]; 

    // Private constructor, so no outsiders have access. 
    private MySingleton() 
    { 
     // Initialize _data member here 
    } 

    // Static method to provide access to instance 
    public static MySingleton Instance 
    { 
     get { return _instance; } 
    } 

    public string GetStringCount 
    { 
     return _data.Length; 
    } 

} 

Iは_instance部材は、それが静的Instance()方法からアクセスされるので、静的として宣言する必要があることを理解します。

他のメンバーは静的として宣言する必要がありますか?定義によって、シングルトンは1回だけ存在するので、メンバーは静的変数が1回だけ存在するのと同じように、1回だけ存在することもできます(単一インスタンスの場合)。

_dataを静的と宣言する必要がありますか?

  • 機能に違いはありますか?
  • パフォーマンスの違いはありますか?
  • 静的または非静的を好むその他の理由はありますか?
+3

他のメンバーは、3行目に作成され、 '_instance'という名前の*オブジェクト*に関連しています。 '_data'を静的に指定すると、それはクラスメンバーであり、オブジェクトメンバーではありません。したがって、構文やベストプラクティスとは関係ありませんが、あなたの意図や目的には関係ありません。 – zerkms

+0

@zerkms明らかに彼はそれを知っていますが、それはシングルトンなので、データはどちらか一方にしか存在しません。本当の違いはありません。 – harold

+0

@njr静的クラスにインターフェースを実装させるための回避策としてシングルトンを使用していますか?(元の意図と一致するようにできるだけ静的なものをすべて保持します) – harold

答えて

3

シングルトンをお持ちの場合は、クラスのインスタンスが1つあります。クラスメンバーは静的であってはなりません(インスタンスプロパティのバッキングフィールドを除く)。シングルトンに複数の統計がある場合は、実際にはシングルトンは1つではなく多くのシングルトンを作成しています。一般的なアドバイスは、絶対に必要なときにのみstaticキーワードを使用することです。

シングルトンインスタンス内にシングルトンデータを静的でないクラスメンバーとして保存する方がクリーンです。

+0

ありがとうアロイス。それははっきりとした答えです。非静的メンバー内にインスタンスデータを格納する方がクリーンであると言っていることがわかります。他の副作用があるのであれば私は不思議でした。 – njr101

+0

パフォーマンスは実際問題ではありません。あなたが実際にそれらを表示しようとする場合を除き、観察可能な副作用はありません。すべてのシングルトンメンバーが静的でない場合は、最初にアクセスしたときにシングルトンインスタンスのすべてのフィールドを初期化します。あなたのシングルトンの中にいくつかのリソースを隠すのであれば、それをdifferntシングルトンに入れるほうが良いかもしれませんし、後でシンジケートでLazy メンバーを使って初期化することもできます。 –

1

スタティッククラス(thisthisを参照)よりもシングルトンを使用することを選択した場合、静的メンバーではなくインスタンスメンバーを持つ方が理にかなっていると思います。

+0

リンクをありがとう。 dotnetperlsは実際に私が最初にこのパターンを見つけた場所です:) – njr101

関連する問題