Дизайн класса Singleton в C #, эти два класса эквивалентны? - PullRequest
4 голосов
/ 12 апреля 2010

Я читал об одном дизайне классов в C # на этом замечательном ресурсе и решил использовать альтернативу 4:

public sealed class Singleton1
{
    static readonly Singleton1 _instance = new Singleton1();

    static Singleton1()
    {
    }

    Singleton1()
    {
    }

    public static Singleton1 Instance
    {
        get
        {
            return _instance;
        }
    }
}

Теперь мне интересно, можно ли это переписать, используя такие свойства авто?

public sealed class Singleton2
{
    static Singleton2()
    {
        Instance = new Singleton2();
    }

    Singleton2()
    {
    }

    public static Singleton2 Instance { get; private set; }
}

Если дело только в удобочитаемости, я определенно предпочитаю вторую версию, но я хочу сделать это правильно.

Ответы [ 4 ]

7 голосов
/ 12 апреля 2010

Это будет работать правильно, но на самом деле это не то же самое.

Даже если свойство помечено как личное, оно не доступно только для чтения (например, присваивается только в конструкторе). Поэтому вы должны использовать первый вариант, который выражает намерение иметь переменную (ссылку), которая не изменяется после ее первоначального присваивания.

4 голосов
/ 12 апреля 2010

Это не эквивалентно, так как поле поддержки autoproperty не будет readonly.

0 голосов
/ 12 апреля 2010

Еще одна вещь, которую необходимо учитывать, заключается в том, что инициализация свойства - это больше, чем просто инициализация поля.

Статический конструктор в Singleton2 вызывает метод set для свойства, который затем устанавливает значение вспомогательного поля. Я понятия не имею, влияет ли это на безопасность потоков или нет, но это еще одно отличие.

0 голосов
/ 12 апреля 2010

Поле поддержки свойства не readonly, но, поскольку это частная собственность, это не такая уж большая проблема. Но большое преимущество для первой реализации состоит в том, что вы можете отбросить статический конструктор, но для второй вы используете статический конструктор. Статический конструктор может добавить снижение производительности (см. http://msdn.microsoft.com/en-us/library/ms182275(v=VS.100).aspx)

...