2012-05-28 4 views
0

У меня есть код, как показано ниже. Я думаю, это Singleton узор. Зачем нужен статический конструктор. И в чем преимущества этого? Спасибо за ответ ...В чем преимущества шаблона Singleton со статическим конструктором?

public sealed class Myclass 
    { 
    static Myclass() 
    { 
     Myclass.Application = new Myclass(); 
    } 

    protected Myclass() 
    { 

    } 

    static Myclass _application; 

    public static Myclass Application 
    { 
     get { return Myclass._application; } 
     protected set { Myclass._application = value; } 
    } 

    string _name; 

    public string Name 
    { 
     get { return _name} 
     protected set { _name= value; } 
    } 
} 

ответ

6

Для начала этот класс является несколько странным для того, чтобы иметь защищенный конструктор. Это не фатальный недостаток, учитывая, что он запечатан, но это явно странно.

Там в potential difference in timing между этим кодом и почти эквивалентным использованием статического переменного инициализатора: (. Там нет необходимости в инкубатор в этом случае, конечно)

static readonly Myclass _application = new Myclass(); 

Вы можете Однако сделайте это с автоматически реализованным свойством.

Использование статической инициализации в . Форма «» предоставляет вам «бесплатную» безопасность потоков - вам не нужно делать блокировку, чтобы получить ленивую инициализацию.

Возможно, вы найдете мой singleton implementation article для получения дополнительной информации.

+0

+1 Не считал нить безопасности. –

0

Там нет непосредственного преимущества в статическом конструкторе, в отличие от ленивого-инстанцировано на ПОЛУЧИТЬ подход, кроме безопасности потока, как указывал ответ Джона Скита. Это может быть или не быть актуальным в вашей ситуации, хотя вы ничего не указываете. Это просто заставляет код выглядеть по-другому, но приведет к одинаковой функциональности.

«Преимущество» одноэлементного шаблона - это простой доступ к одному экземпляру класса, в основном своего рода «глобально» доступный экземпляр класса.

Я говорю «преимущество», поскольку есть много дискуссий о том, что шаблон Singleton является анти-шаблоном. Я нахожусь на заборе. В небольшом приложении это может функционировать нормально, и большинство предлагаемых альтернативных решений включают в себя рамки для разработки зависимостей (часто иногда с продолжительностью жизни «Синглтон»!), Что может оказаться нецелесообразным для небольших приложений.

Просто примечание, имеющее класс sealed с protected членами бессмысленно - закрытые классы не могут быть унаследованы.

0

Если вы пишите таким образом, вы можете использовать авто и не на самом деле реализовать it.

Скажет так:

public sealed class Myclass 
{ 
     static Myclass() 
     { 
      Myclass.Application = new Myclass(); 
     } 

     ..... 
     public static Myclass Application {get;set;} 
     ... 


} 

В принципе, нет какого-либо practcal преимущества, если не нравится одно: код-стиля.

0

Использование типа ctor здесь является гарантией того, что экземпляр singleton будет инициализирован один раз. Это проще, чем двойной шаблон блокировки при реализации ленивой инициализации синглтона, но у него есть недостаток по той же причине - создание однопользовательской системы может быть очень дорогостоящим, и singleton никогда не может использоваться во время жизни приложения.

+0

Если синглтон никогда не используется, то тип не будет инициализирован, поэтому расход не будет понесен. –

+0

Для этого примера кода - да, вы правы. Мой ответ был связан с более распространенным случаем ... например. когда класс имеет открытый статический метод. – Dennis

+0

Я не нахожу, что обычный случай, на самом деле - я обычно вижу одиночные одиночки с одним открытым статическим членом, чтобы получить экземпляр, а затем все остальное как члены экземпляра. Это улучшает согласованность, помимо всего прочего. Вы можете использовать частный класс «владелец» для ленивой инициализации в этом случае, хотя - см. Пятый вариант в статье, связанной в нижней части моего ответа. –

-1

Статический конструктор, который вызывается во время загрузки сборки ...

EDIT: благодаря джон я был неправ ... Теперь я понимаю, статические конструкторы в C# определены для выполнения только тогда, когда экземпляр класса создается или ссылается статический член ..

+2

Нет, нет. Он выполняется только тогда, когда тип сначала * используется *. См. Http://csharpindepth.com/Articles/General/BeforeFieldInit.aspx –

0

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

Во всяком случае, это не хороший пример кода, который вы нашли.

  • Он имеет protected членов, даже если это sealed, который только делает код запутанной. Они должны быть private.
  • Если вы взглянете на объект Name, вы заметите, что его невозможно установить, поэтому он всегда будет null.
Смежные вопросы