2017-04-05 13 views
1

以下に示すシングルトンクラスの場合、MyListを初期化する適切な方法は何ですか?フィールドMyList(オプション1)またはInstance.MyList(オプション2)を直接参照していますか?ここでベストプラクティスは何ですか?私の腸はインスタンスを通過すると言いますが、私は自分自身を二次的に推測しており、どこでも決定的な答えを見つけることはできません。シングルトンクラス内のプライベートシングルトンプロパティの参照

public class Foo 
{ 
    private readonly static Lazy<Foo> _instance = 
     new Lazy<Foo>(() => new Foo()); 

    private List<string> MyList; 

    public static Foo Instance 
    { 
     get { return _instance.Value; } 
    } 

    private Foo() 
    { 
     MyList = new List<string> {"a","b","c"}; //Option 1 

     Instance.MyList = new List<string> {"a","b","c"}; //Option 2 
    } 
} 
+0

2つのオプションに違いはないと思います。個人的に私は 'this.PropertyName'を使用したいのですが、VSは' this 'を削除するように私に迷惑をかけています。 –

+0

もっと良い例に更新しましょう... – philorube

+0

私はコンストラクタからインスタンスを呼び出さないでしょう。再び、私は違いがあるとは思わないが、ちょっと変わったようだ。 –

答えて

4

まず、どちらの方法も問題ないと思います。つまり、私は「インスタンス」識別子を使用しないオプションを好む。インスタンスの概念は実際にシングルトンクラスの外部のコードに属します。クラス内では、それがシングルトンであるという事実はよく知られているはずです。したがって、インスタンス識別子の指定は冗長です。

+0

論理的で簡潔です。ありがとう! – philorube

0

Singletonパターンは、インスタンスを1つだけ持つことができ、それでもかなり静的タイプのようなだけのタイプとして処理されるよりも、型のインスタンスのように扱われているタイプを作成するためのものです。したがって、MyListが単一インスタンスの一部である場合、そのインスタンスのインスタンス変数であり、クラスの静的メンバーではありません。

シングルトンパターンの特長の1つは、静的なメンバーやクラスを使用するのと比べて、テストのための模擬が容易で、複数のインスタンスを後で使用する方が簡単です。これらの目的のために、MyListをインスタンスメンバーにすることも役に立ちます。

インスタンスを使用している場合は、そのインスタンス内にMyListまたはthis.MyList、他の場所からはInstance.MyListと記述できます。これらのどれも他のどのものよりも正しいものではなく、あなたが読めるものに本当に依存します。重要なのは、コンビネーションを混ぜないことです。これは最悪の可読性オプションです。

+0

これは当てはまるかもしれませんが、質問に全く答えません。 –

関連する問題