Является ли эта реализация Singleton правильной и поточно-ориентированной? - PullRequest
7 голосов
/ 29 июня 2010

Является ли эта одноэлементная реализация корректной и поточно-ориентированной?

class Class
{
    public static readonly Class Instance;

    static Class()
    {
        Instance = new Class();
    }

    private Class() {}
}

Ответы [ 4 ]

12 голосов
/ 29 июня 2010

Технически ваша версия должна работать. Однако я не рекомендовал бы открывать открытое поле в вашем классе Singleton и предпочел бы использовать свойство (только с геттером). Это поможет в будущем вашему API, если вам нужно будет внести изменения позже. Я также рекомендую заклеить любую одноэлементную реализацию, так как создание подклассов одноэлементного класса почти всегда является плохой идеей и проблематичным.

Лично я бы использовал следующее в C #, если вы ориентируетесь на .NET 3.5 или более раннюю версию:

public sealed class Singleton
{
    static readonly Singleton instance = new Singleton();

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

    static Singleton() { }
    private Singleton() { }
}

Если вы используете .NET 4, вы можете сделать это еще проще для себя через Lazy<T>:

public sealed class Singleton
{
     private static readonly Lazy<Singleton> instance = new Lazy<Singleton>( () => new Singleton() );
     private Singleton() {}
     public static Singleton Instance { get { return instance.Value; } }
}

Версия .NET 4 также обладает тем преимуществом, что она полностью ленива - даже если ваш класс Singleton имеет другие статические методы, которые используются до доступа к свойству "Экземпляр" Вы также можете создать полностью ленивую версию .NET 3.5, используя закрытый вложенный класс. Джон Скит продемонстрировал это в своем блоге .

2 голосов
/ 29 июня 2010

Да.Я бы также сделал класс 'sealed', чтобы избежать путаницы в будущем.

1 голос
/ 29 июня 2010

Вы должны выполнить инициализацию в объявлении переменной:

public static readonly Class Instance = new Class();
1 голос
/ 29 июня 2010

Хорошее обсуждение того, как это сделать, здесь:

http://www.yoda.arachsys.com/csharp/singleton.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...