2015-09-23 15 views
5

Tak więc, z nowym C# 6 mamy te staranne inicjatory auto-własności. Pomyślałem, że równie dobrze mogę wykorzystać je, by tworzyć bardziej zwięzłe singletony niż kiedykolwiek. Najwyraźniej someone else wpadł na ten pomysł.Automatyczny inicjator właściwości Singleton implementacja

public sealed class Singleton 
{ 
    public static Singleton Instance { get; } = new Singleton(); 
    private Singleton() { /* some initialization code */ } 
} 

Moje pytania są następujące:

  1. Jak bezpieczny wątku to jest?
  2. Jak leniwy jest lub kiedy instancja jest faktycznie tworzona? (nie priorytet, ale byłoby dobrze na przyszłość)
  3. Czy to ogólnie dobry pomysł?

(może to wyglądać podobnie do this question, ale to nie jest)

Odpowiedz

6

Twój kod zostanie rozszerzona na następujące kwestie:

public sealed class Singleton 
{ 
    private static readonly Singleton <Instance>k__BackingField = new Singleton(); 
    public static Singleton Instance { get { return <Instance>k__BackingField; } } 
    private Singleton() { /* some initialization code */ } 
} 

(<Instance>k__BackingField jest unspeakable name pola kompilatora generowane.)

Właściwości kodu będą więc dokładnie takie same jak w powyższym kodzie. Mianowicie, ten wzór jest bezpieczny dla wątków i może być dobrym pomysłem, w zależności od okoliczności.

Zakładając, że nie uzyskujesz dostępu do żadnych innych statycznych elementów tego typu przed uzyskaniem dostępu do Instance, dokładny stopień lenistwa zależy od środowiska wykonawczego. Zwykle będzie to coś w rodzaju "instancja jest tworzona za pierwszym razem, gdy metoda jest kompilowana JIT", ale nie masz żadnej gwarancji na to.

Jeśli chcesz się upewnić, że instancja jest tworzona tuż przed pierwszym dostępem do Instance, dodaj pusty klasę statyczną do swojej klasy. (Może to mieć niewielki negatywny wpływ na wydajność, ale to prawdopodobnie nie będzie miało dla ciebie znaczenia.)

Ponieważ większość tego nie jest specyficzna dla C# 6, dobrym źródłem dalszych informacji będą artykuły Jona Skeeta singletons i static constructors/type initializers.