C#でSingletonクラスをDIなしで実装する方法


C#でDI(Dependency Injection)を使用せずにSingletonクラスを実装する方法はいくつかあります。以下にいくつかの方法とそれぞれのコード例を示します。

方法1: 静的フィールドを使用する方法

public class SingletonClass
{
    private static SingletonClass instance;
    private SingletonClass()
    {
        // コンストラクタをプライベートにすることで、外部からのインスタンス化を防ぐ
    }
    public static SingletonClass Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new SingletonClass();
            }
            return instance;
        }
    }
// インスタンスのメソッドやプロパティを定義する
}

この方法では、SingletonClass自体が唯一のインスタンスを保持するために静的フィールドを使用します。インスタンスが必要な場合は、Instanceプロパティを介してアクセスできます。

方法2: レイジーロード(遅延読み込み)を使用する方法

public class SingletonClass
{
    private static readonly Lazy<SingletonClass> lazyInstance = new Lazy<SingletonClass>(() => new SingletonClass());
    private SingletonClass()
    {
        // コンストラクタをプライベートにすることで、外部からのインスタンス化を防ぐ
    }
    public static SingletonClass Instance => lazyInstance.Value;
    // インスタンスのメソッドやプロパティを定義する
}

この方法では、Lazy<T>クラスを使用してインスタンスが必要な時まで初期化を遅延させます。lazyInstanceフィールドは、Instanceプロパティが呼び出されたときに初期化され、その後はキャッシュされた値が返されます。

これらの方法はいずれもDI(Dependency Injection)を使用せずにSingletonクラスを実装するための基本的な方法です。ただし、DIコンテナを使用することで、より柔軟な依存性の注入が可能になります。