2010-04-11 4 views
5

Je mis en œuvre un modèle Singleton comme celui-ci:Est-ce une implémentation Singleton valide, paresseuse et thread-safe pour C#?

public sealed class MyClass { 

    ... 

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

    ... 

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

De googler autour de C# implémentations Singleton, il ne semble pas que c'est une façon courante de faire des choses en C#. J'ai trouvé une implémentation similaire, mais la classe SingletonHolder n'était pas statique et incluait un constructeur statique explicite (vide).

Est-ce une manière valide, paresseuse et sans danger pour les threads d'implémenter le pattern Singleton? Ou y a-t-il quelque chose qui me manque?

Répondre

6

Jon Skeet a écrit un article sur l'implémentation du motif Singleton en C#.

La mise en œuvre paresseuse est une 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(); 
    } 
} 

Remarquez en particulier que vous devez déclarer explicitement un constructeur, même si elle est vide afin de le rendre privé.