私は昨日インタビューを受けましたが、質問の 1 つはシングルトンとは何か、それをどのように実装するかというものでした。
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 .:質問はシングルトンに関するものではありません。静的クラスを使用する代わりに、静的メンバーのみを持つインスタンス化可能なクラスを作成することを選択するシナリオを説明することです (したがって、最終的にはプライベート コンストラクターが必要になります)。