2

スレッドセーフなシングルトン クラスを実装する方法について読んでいます。さまざまな作成方法を見つけることができましたが、プロパティやメソッドなどをクラス内のどこに配置する必要があるかについての情報を見つけることができませんでした。

例えば:

public sealed class Singleton
{
   //Do I put properties here?     

   private Singleton() {}

   public static Singleton GetInstance()
   {
      return NestedSingleton.singleton;
   }

   class NestedSingleton
   {
      //Do I put properties here?  
      internal static readonly Singleton singleton = new Singleton();

      static NestedSingleton() {}

      //Do my methods go here
   }

  //or here?
}
4

3 に答える 3

6

メソッドは外部クラスに入ります。ネストされたクラスの唯一の目的は、外部クラスのシングルトン インスタンスの初期化の特定のタイミングを強制することです。

GetInstanceメソッドが -not への参照を返すことを忘れないでSingletonくださいNestedSingleton。実際、NestedSingletonは非公開であるため、外部のコードSingletonはその存在を知りません。staticあなたもそれをクラスにしたいかもしれません。(これにより、インスタンス メンバーを追加しようとすることすらできなくなります。)

個人的には、初期化を厳密に制御したい場合にのみこのフォームを使用します。通常は、Singletonクラス自体でフィールドを使用するだけです。(またはLazy<T>...)それは少し簡単です。C# でのシングルトンの実装に関する私の記事をまだ読んでいない場合は、ぜひご覧ください。(もうご覧になっていると思いますが…)

于 2013-09-24T14:46:24.680 に答える
3

すべてのインスタンス メンバーを外部クラスに配置する必要があります。

内部クラスは、シングルトン値を遅延初期化するためにのみ存在するプライベート ホルダー タイプです。
である必要がありますstatic

于 2013-09-24T14:46:33.547 に答える
0

この投稿もご覧ください。これは、私がいくつかのプロジェクトで使用しているシングルトンの実装です。

C# < 4 では、以下を使用できます。

public class Singleton
{
    private static Singleton _instance;
    private static object _lock = new object();

    private Singleton(){}

    public static Singleton Instance
    {
        get
        {
            if(_instance == null)
            {
               lock(_lock)
               {
                   if(_instance == null)
                       _instance = new Singleton();
               }
            }
            return _instance;
        }
    }
}

またはC#4で

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

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

この実装はスレッドセーフです。

于 2013-09-24T14:53:12.300 に答える