Эта реализация Singleton корректна и ориентирована на многопотоковое исполнение?

Эта одноэлементная реализация корректна и ориентирована на многопотоковое исполнение?

class Class
{
    public static readonly Class Instance;

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

    private Class() {}
}
7
задан Anthony Pegram 28 June 2010 в 20:50
поделиться

4 ответа

Технически ваша версия должна работать. Однако я бы не рекомендовал раскрывать общедоступное поле в вашем классе 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 :

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, используя частный вложенный класс. Джон Скит продемонстрировал это в своем блоге .

12
ответ дан 6 December 2019 в 12:46
поделиться

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

2
ответ дан 6 December 2019 в 12:46
поделиться

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

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

1
ответ дан 6 December 2019 в 12:46
поделиться

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

public static readonly Class Instance = new Class();
1
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: