2009-07-15 11 views
20

Mam pamięć podręczną obiektów, która implementuje wzorzec projektu Singleton. Moje podejście do singleton zawsze leniwie ładowało statyczną instancję, gdy właściwość była dostępna po raz pierwszy.Klasa Static Constructor & Singleton

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

Wiem jednak, że takie podejście nie jest wątku bezpieczne i czek na przykład będąc zerowy wprowadza małą nieefektywność. Czy byłoby rozsądnie zaimplementować na klasie konstruktor statyczny, który tworzy instancję statyczną?

Jak rozumiem, konstruktor statyczny byłby wywoływany za każdym razem, gdy wystąpi pierwszy dostęp do właściwości statycznych. Czy jest to poprawne i czy przyniesie jakieś korzyści w porównaniu z bieżącym podejściem do leniwego obciążenia, czy byłoby lepiej zbadać implementację proxy lub użyć blokady, aby wymusić jej bezpieczeństwo wątku?

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

nie mam dużo doświadczenia z konstruktorów statycznych, więc nie chce skoczyć w ten pomysł, jeśli jest równa lub gorzej realizacja leniwe własności obciążenia.

Cheers, Gary

+1

Uważam ten wątek Q & A da ci to, co chcesz: http://stackoverflow.com/questions/246710/how-to-implement-a-singleton-in-c –

Odpowiedz

17

Jon Skeet posiada ładny article na pojedynczych omawianie tej kwestii.

+0

Działa to dobrze Pojemniki IOC też: http://www.tavaresstudios.com/Blog/post/Resolving-a-Singleton-Heres-how.aspx –

+0

Link należy zaktualizować do http://csharpindepth.com/Articles/General/Singleton. aspx – Dorus