8

C# で実装されたシングルトンは次のようになります。

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

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

static を使用して実装すると、次のようになります。

public static class Globals{
  public static Singleton Instance = new Singleton();
}

このようにして、アプリはアプリ全体に対して 1 つのインスタンスのみを取得する必要があります。では、これら2つのアプローチの違いは何ですか? 静的メンバーを直接使用しないのはなぜですか (よりシンプルで簡単です)?

4

2 に答える 2

9

2 番目の方法を使用する場合:

public static class Globals{
  public static Singleton Instance = new Singleton();
}

誰かがすることを妨げるものは何もありません:

Singleton anotherInstance = new Singleton(); // Violates singleton rules

また、最初のバージョン (試行) が達成するのと同じ遅延初期化が得られないことに加えて、パブリック フィールドを使用しているため、将来、値が変更されたときに何が起こるかを変更する必要がある場合に、同じ柔軟性が得られません。が取り出されます。

.NET 4 は、シングルトンを作成するための潜在的に優れたアプローチを提供することに注意してください。

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

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         return instance.Value;
      }
   }
}

これは、完全にレイジー完全にスレッド セーフであるだけでなく、シンプルでもあるため、優れています。

于 2012-10-01T17:50:32.953 に答える
-1

以下は static と Singleton の違いです:

  1. シングルトンはパターンですが、静的はキーワードです。
  2. シングルトン クラスは静的メソッドと非静的メソッドを持つことができますが、静的クラスは静的メンバーとメソッドしか持つことができません。
  3. シングルトン クラスではインターフェイスを実装できますが、静的クラスではインターフェイスを実装できません。
  4. Singleton クラスは拡張できますが、静的クラスは拡張できません。つまり、Singleton クラスは任意のタイプのクラスから派生できます。

より静的なvsシングルトン

于 2012-10-01T17:58:04.977 に答える