3

私は昨日インタビューを受けましたが、質問の 1 つはシングルトンとは何か、それをどのように実装するかというものでした。

MSDN の実装

MSDN のソリューション #1:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

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

私は最も単純な解決策 (msdn の実装からの解決策 1) を提供しましたが、彼はスレッドセーフな解決策 (解決策 3) を望んでいました。

MSDN の解決策 #3:

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

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

         return instance;
      }
   }
}

私が興味をそそられるのは、msdn の例のプライベートコンストラクターです。そんなものがあるとは知りませんでした。

その上でmsdnを見てみましょう

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}

それから私は尋ねます:

クラスを静的にするのではなく、静的メンバーのみを持つクラスがあり、そのインスタンスが作成されないようにして、プライベートコンストラクターを使用したくないのはなぜですか?!

PS .:質問はシングルトンに関するものではありません。静的クラスを使用する代わりに、静的メンバーのみを持つインスタンス化可能なクラスを作成することを選択するシナリオを説明することです (したがって、最終的にはプライベート コンストラクターが必要になります)。

4

1 に答える 1

4

クラスを静的にするのではなく、静的メンバーのみを持つクラスがあり、そのインスタンスが作成されないようにして、プライベートコンストラクターを使用したくないのはなぜですか

静的クラスでシングルトンを使用する場合の主な違いは、前者にインターフェイスを実装し、シングルトンの具体的な実装の詳細にバインドせずにそのまま渡すことができるのに対し、静的クラスではできないことです。

それ以外では、シングルトン インスタンス変数は静的である必要があり、通常のインスタンス メンバーとして公開できます。

于 2016-03-21T11:36:54.003 に答える