2009-07-15 3 views
20

Ich habe einen Objekt-Cache, der das Singleton-Entwurfsmuster implementiert. Meine Herangehensweise an Singleton bestand immer darin, die statische Instanz zu laden, wenn auf die Eigenschaft zum ersten Mal zugegriffen wird.Statischer Konstruktor & Singleton-Klasse

Allerdings weiß ich, dass dieser Ansatz nicht threadsicher ist und der Check zum Beispiel null ist, bringt eine kleine Ineffizienz mit sich. Wäre es klug, einen statischen Konstruktor für die Klasse zu implementieren, die die statische Instanz instanziiert?

Wie ich es verstehe, würde der statische Konstruktor immer aufgerufen werden, wenn der erste Zugriff auf statische Eigenschaften auftritt. Ist dies gültig und bietet es Vorteile gegenüber dem aktuellen Lazy Load-Ansatz oder wäre es besser, eine Proxy-Implementierung zu untersuchen oder eine Sperre zu verwenden, um es threadsicher zu machen?

public static Widget 
    { 
     get 
     { 
      if(instance==null) 
      { 
       lock(padlock) 
       { 
        if(instance==null) instance = new Widget(); 
       } 
      } 
      return instance; 
     } 
    } 

ich nicht viel Erfahrung mit statischen Konstruktoren habe, so will nicht mit dieser Idee springen, wenn sie eine gleiche oder schlechte Umsetzung der faul Last Eigenschaft ist.

Cheers, Gary

+1

Ich glaube, das Q & A Thread wird dir geben, was Sie wollen: http://stackoverflow.com/questions/246710/how-to-implement-a-singleton-in-c –

Antwort

17

Jon Skeet einen schönen article auf Singletons über dieses Thema hat.

+0

Das funktioniert gut mit IOC Container auch: http://www.tavaresstudios.com/Blog/post/Resolving-a-Singleton-Heres-how.aspx –

+0

Der Link sollte auf http://csharpindepth.com/Articles/General/Singleton aktualisiert werden. aspx – Dorus