2014-11-07 2 views
3

На MSDN я нашел два подхода к созданию одноплодной класса:Статический конструктор в Singleton шаблон проектирования

public class Singleton { 
    private static Singleton instance; 
    private Singleton() {} 
    public static Singleton Instance { 
     get { 
     if (instance == null) 
      instance = new Singleton(); 
     return instance; 
     } 
    } 
} 

и

public sealed class Singleton { 
    private static readonly Singleton instance = new Singleton(); 
    private Singleton(){} 
    public static Singleton Instance { 
     get { return instance; } 
    } 
} 

Мой вопрос: можем ли мы использовать только статический конструктор, который будет делать для нас этот объект перед первым использованием?

+2

http://csharpindepth.com/Articles/General/Singleton.aspx#nested-cctor – Habib

+0

Прочтите статью Джона Скита: http://csharpindepth.com/articles/general/singleton.aspx К сожалению, только что реализованный @Habib уже отправил его. – xxbbcc

ответ

4

Можете ли вы использовать статический конструктор, конечно. Я не знаю, почему вы хотите использовать его, просто используя второй пример, который вы показали, но вы, конечно, могли бы. Это будет функционально идентично вашему второму примеру, но просто требует больше ввода текста.

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

+0

Просто боялся, что он не полностью идентичен – user3616181

+1

@ user3616181 Инициализаторы статических полей перемещаются в статический конструктор, за кулисами. – Servy

+0

Еще один вопрос: почему во втором подходе мы объявляем экземпляр singleton как readonly, в то время как у нас свойство имеет только getter? – user3616181