Два вопроса по Синглтону C # - PullRequest
2 голосов
/ 07 апреля 2010

Рассмотрим следующий код

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

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

Вопрос

1) Вот для чего предназначен статический конструктор? (Я знаю, что статический конструктор будет вызываться до того, как будет создан первый экземпляр класса). Но в контексте приведенного выше кода я не могу использовать его без статического конструктора?

2) Я слышал, что одним из преимуществ синглтона является то, что он может быть распространен на завод. Поскольку это закрытый класс, как вы расширите его до фабрики? Можете привести пример?

Ответы [ 2 ]

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

Статический конструктор гарантирует, что синглтон действительно не создан до его использования.Если статический конструктор отсутствует, у CLR гораздо больше возможностей для запуска инициализатора типа.См. Мою статью о beforefieldinit и мой блог о .NET 4 изменениях инициализации типа для получения дополнительной информации.

Что касается превращения синглтона в фабрику - выдействительно нужно дать больше контекста.Ваше свойство Instance может выбрать всегда ли возвращать ссылку на один и тот же объект или нет, я полагаю ...

0 голосов
/ 07 апреля 2010
  1. Статический конструктор не нужен. SKEET!
  2. Я никогда не слышал об этом. Вы не можете, очевидно, если класс запечатан. Но вы можете умеренно легко переписать его как фабрику, так как существует только один способ его создания - через свойство. Измените это на метод, и вы получите старт фабрики. Метод может каждый раз возвращать один и тот же экземпляр, или возвращать экземпляр из пула, или делать все, что ему захочется.

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

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