2010-04-11 3 views
5

Я реализовал шаблон Singleton так:Является ли это допустимой, ленивой, потокобезопасной версией Singleton для C#?

public sealed class MyClass { 

    ... 

    public static MyClass Instance { 
     get { return SingletonHolder.instance; } 
    } 

    ... 

    static class SingletonHolder { 
     public static MyClass instance = new MyClass(); 
    } 
} 

От погуглить вокруг реализаций C# Singleton, это не кажется, что это общий способ делать вещи в C#. Я нашел одну подобную реализацию, но класс SingletonHolder не был статичным и включал явный (пустой) статический конструктор.

Является ли это допустимым, ленивым, потокобезопасным способом реализации шаблона Singleton? Или что-то мне не хватает?

ответ

6

Jon Skeet написал article о внедрении шаблона Singleton в C#.

Ленивый реализация версии 5:

public sealed class Singleton 
{ 
    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly Singleton instance = new Singleton(); 
    } 
} 

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

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