単例の3つの実装--C#

1424 ワード

従来のdouble check:
public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();


    Singleton()
    {
    }


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

欠陥:
1.コードが肥大化している
2.double checkは性能が少し悪い(後の実装バージョンより)
利用するNetframework staticプロパティのバージョン:
public sealed class Singleton
{
    public static readonly Singleton instance = new Singleton();


    private Singleton()
    {
    }
}

1.単一例とスレッドのセキュリティを保証する方法
静的インスタンスはAppDomainにメモリが1つしかないので
2.欠陥?
静的構造関数はfieldの前に実行され、lazyはありません(使用する場合のみインスタンス)
Lazyバージョン
public sealed class Singleton
{
    public static readonly Singleton instance = new Singleton();


    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }


    private Singleton()
    {
    }


}

改善点:
宣言静的コンストラクション関数を表示し、コンパイラにfieldの後に実行するように伝えます.これにより、fieldが使用されるだけでインスタンス化されます.