2010-04-11 4 views
5

ich ein Singleton Muster wie folgt umgesetzt:Ist dies eine gültige, faule, thread-sichere Singleton-Implementierung für C#?

public sealed class MyClass { 

    ... 

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

    ... 

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

Von googeln um für C# Singleton-Implementierungen, es scheint nicht, wie dies eine gängige Methode ist, die Dinge in C# zu tun. Ich fand eine ähnliche Implementierung, aber die SingletonHolder-Klasse war nicht statisch und enthielt einen expliziten (leeren) statischen Konstruktor.

Ist dies eine gültige, faule, thread-sichere Möglichkeit, das Singleton-Muster zu implementieren? Oder gibt es etwas, das ich vermisse?

Antwort

6

Jon Skeet hat eine article über das Implementieren des Singleton-Musters in C# geschrieben.

Die faule Implementierung ist die Version 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(); 
    } 
} 

Hinweis insbesondere, dass Sie explizit einen Konstruktor deklarieren, auch wenn es leer ist, um es privat zu machen.