2017-02-19 7 views
3

の異なる値Iは、シングルトンパターンを使用して単純なクラスがあります。Singletonパターン - プロパティ

public class MyClass 
{ 
    private MyClass() 
    { } 

    private static MyClass instance; 
    private static readonly object locked = new object(); 

    //Singleton 
    public static MyClass Instance 
    { 
     get 
     { 
      lock (locked) 
      { 
       if (instance == null) 
       { 
        instance = new MyClass(); 
       } 
      } 

      return instance; 
     } 
    } 

    public string Rand 
    { 
     get 
     { 
      return new Random().Next(2500).ToString(); 
     } 
    } 
} 

をしかし、私がしなければ:

var instance1 = MyClass.Instance; 
var instance2 = MyClass.Instance; 

instance1.Randinstance2.Randは異なる値を持っています。

私のシングルトンには2つの異なるインスタンスがあり、これを解決する方法は何ですか?

答えて

1

あなたはランドにアクセスしようとするたびに、それは代わりに、この試すことが新しいランダムインスタンス

を作成させ、getメソッドを呼び出します:あなたは、ランダムな値毎回Randを計算している

private string _rand = return new Random().Next(2500).ToString(); 

public string Rand { 
get { 
    return _rand; 
} 
} 
+0

ご協力ありがとうございました –

1

ですから読んでください。

+0

ご協力ありがとうございました –

1

プライベートフィールドを作成するか、これを作成するたびに同じ値を作成する場合は、毎回新しいランダム値を作成するRandプロパティにアクセスするシングルインスタンスとの違いがあります

private string _rand; 

    public static MyClass Instance 
    { 
     get 
     { 
      lock (locked) 
      { 
       if (instance == null) 
       { 
        instance = new MyClass(); 
        _rand = return new Random().Next(2500).ToString(); 

       } 
      } 

      return instance; 
     } 
    } 

public string Rand { 
get { 
    return _rand; 
} 
} 
+0

ありがとうございました –

1

ただ、ミックスにいくつかのC#6を追加し、 の違いのために、.NET 4.

public class MyClass 
     { 
      private static Lazy<MyClass> instance = new Lazy<MyClass>(() => new MyClass()); 

      public static MyClass Instance => instance.Value; 

      public string Rand { get; } = (new Random()).Next(2500).ToString(); 

      private MyClass() { } 
     } 

編集 のLazyを使用しますとpublic string Rand { get; } = (new Random()).Next(2500).ToString(); 最初のコードは、フィールドの初期化中(コンストラクタの前に実行される特別なステップ)に2番目のコードが実行されている間、プロパティ本体(get {すべてが聞こえる})のコードを実行します。これは、自動プロパティ初期化子と呼ばれます。そして、あなたはあなたがhttps://blogs.msdn.microsoft.com/csharpfaq/2014/11/20/new-features-in-c-6/

NOTEを見ることができます詳細情報については、この

public readonly string rand = (new Random()).Next(2500).ToString(); 

      public string Rand 
      { 
       get 
       { 
        return rand; 
       } 
      } 

を身もだえに同じである:シングルトンは、あなたがそれを使用していないことができればそうAntipatternであると考えられています。

+0

なぜ 'string Rand {get;次の(2500).ToString(); 'get {return new Random()。Next(2500).ToString();}} =(新しいランダム())。 } 'は同じ値を返しませんか? –

+0

@ Azerty123さらに編集しました。 –

+0

@ Azerty123シングルトンは[Antipattern](https://www.microsoft.com/net/tutorials/csharp/getting-started/patterns-antipatterns)とみなされています。それを使用することはできません。 –

関連する問題