2

C# でシングルトン パターンを実装するには、さまざまな方法があります。ここでは、最も一般的に見られる、スレッドセーフではないものから始めて、完全に遅延ロードされ、スレッドセーフで、シンプルで高性能なバージョンまで、エレガンスの逆の順序でそれらを紹介します。

私はグーグルで「シングルトンを実装する方法」を探していて、3つの方法を見つけました.どのシングルトン実装がC#より優れていますか?

1)このコードは lock() を使用します

public class Singleton

{
    // Static object of the Singleton class. 
    private static volatile Singleton _instance = null;

    /// <summary>
    /// The static method to provide global access to the singleton object.
    /// </summary>
    /// <returns>Singleton object of class Singleton.</returns>
    public static Singleton Instance()
    {
        if (_instance == null)
        {
            lock (typeof(Singleton))
            {
                _instance = new Singleton();
            }
        }
        return _instance;
    }

    /// <summary>
    /// The constructor is defined private in nature to restrict access.
    /// </summary>
    private Singleton() { }

}  

2)このコードは static init です

/// <summary>
/// A sealed class providing access to it's ONLY readonly static instance.
/// </summary>
sealed class SingletonCounter 
{
    public static readonly SingletonCounter Instance = 
         new SingletonCounter();

    private SingletonCounter() {}
}

3)このコードは Lazy 型を使用しています。

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
} 
4

1 に答える 1

1

特別な理由がない限り、「シンプル」を選択する必要があります。実際、よりエキゾチックなパターンを使用すると、それらを台無しにする可能性があることをきちんと示しました (1 のように、少なくとも 2 つの注目すべき問題があります)。したがって、明らかに正しいという理由で 2 を選択する必要があります。怠惰ではないという欠点がありますが、その型には他のメソッドがないため、インスタンスを取得することしかできないため、それは問題ではありません。怠け者になるのに便利です。また、完全にロックフリーであり、インスタンスを取得するために評価される条件はありません。

于 2013-02-26T12:40:56.763 に答える