Различные реализации Сингелтона - PullRequest
0 голосов
/ 02 апреля 2011

Когда я познакомился с одноэлементным шаблоном, это был способ его реализации:

public class MySingleton
{
    private MyStingleton instance;

    private MySingleton()
    {
        //constructor
    }

    public static MySingleton GetInstance()
    {
        if(instance== null)
        {
            instance = new MySingleton();    
        }
        return instance;
    }
}

В чем преимущество такого способа по сравнению с этим:

public class MySingleton
{
    public static readonly MyStingleton Instance = new MySingleton();

    private MySingleton()
    {
        //constructor
    }

}

Ответы [ 3 ]

4 голосов
/ 02 апреля 2011

Первый пример не является потокобезопасным. Вы можете взглянуть на следующую статью .

2 голосов
/ 02 апреля 2011

В первом случае экземпляр не создается до тех пор, пока вы не вызовете статический метод GetInstance.вы создаете экземпляр только тогда, когда вызываете этот метод.

Во втором случае экземпляр является константой, концептуально отличается.

используется для использования первого, это шаблон, который я всегда имеювидно, и вы можете контролировать, когда создается экземпляр.

2 голосов
/ 02 апреля 2011

Обе эти одноэлементные реализации небезопасны, и я не вижу никакой выгоды от использования второй по сравнению с первой.

Вероятно, вам следует проверить эту ссылку: http://www.yoda.arachsys.com/csharp/singleton.html, где указано число одноэлементных реализаций, для каждой из которых объясняется, почему они хорошие или плохие.

Последний правильный синглтон такой:

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

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

        internal static readonly Singleton instance = new Singleton();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...