2010-04-06 4 views
2

Рассмотрим следующий кодДва вопроса на Singleton C#

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

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

Вопрос

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

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

ответ

7

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

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

+0

@ Джон Я думаю, что они на самом деле есть, что код одного из ваших предыдущих постов: http://stackoverflow.com/questions/2550925/singleton-by-jon-skeet-clarification/2550935#2550935 –

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

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

+4

LOL на * SKEET! * –

Смежные вопросы