- 遅延初期化 (Lazy Initialization) を使用したシングルトン:
public class Singleton
{
private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());
private Singleton()
{
// インスタンスの初期化処理
}
public static Singleton Instance => instance.Value;
}
この方法では、Lazy<T>
クラスを使用してインスタンスを遅延初期化します。Lazy<T>
はスレッドセーフであり、複数のスレッドから同時にアクセスされても正しく動作します。
- スレッドセーフな実装:
public class Singleton
{
private static readonly object lockObject = new object();
private static Singleton instance;
private Singleton()
{
// インスタンスの初期化処理
}
public static Singleton Instance
{
get
{
lock (lockObject)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
この方法では、ロック機構を使用してスレッドセーフな動作を実現します。lock
ステートメントを使用して複数のスレッドからの同時アクセスを制御し、インスタンスがまだ作成されていない場合にのみインスタンスを作成します。
- 静的コンストラクタを使用したシングルトン:
public class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton()
{
}
private Singleton()
{
// インスタンスの初期化処理
}
public static Singleton Instance => instance;
}
この方法では、静的コンストラクタを使用してインスタンスを作成します。静的コンストラクタはクラスが最初に使用される前に自動的に実行されるため、インスタンスの作成を保証します。
これらはC#でのシングルトンクラスの実装のいくつかの例です。どの方法を選択するかは、プロジェクトの要件や制約によって異なります。必要に応じて適切な方法を選択してください。