2010-04-06 3 views
2

Considérez le code suivantDeux questions sur Singleton C#

public sealed class Singleton 
{ 
    private static readonly Singleton instance = new Singleton(); 
    public static Singleton Instance { get { return instance; } } 

    static Singleton() {} 
    private Singleton() {} 
} 

Question

1) Voici quel est le but du constructeur statique? (Je sais que le constructeur statique sera appelé avant la création de la première instance de la classe). Mais dans le contexte du code ci-dessus ne puis-je l'utiliser sans le constructeur statique? 2) J'ai entendu dire que l'un des avantages de singleton est qu'il peut être étendu en usine. Puisqu'il s'agit d'une classe scellée, comment allez-vous l'étendre en usine? Pouvez-vous donner un exemple?

Répondre

7

Le constructeur statique s'assure que le singleton n'est vraiment pas construit avant d'être utilisé. Si le constructeur statique n'est pas présent, le CLR a beaucoup plus de marge de manœuvre quand il exécute l'initialiseur de type. Voir mon article on beforefieldinit et mon blog sur .NET 4 type initialization changes pour plus d'informations. Pour transformer un singleton en usine, il faudrait vraiment donner plus de contexte. Votre Instance propriété pourrait choisir si pour revenir toujours une référence au même objet ou non, je suppose ...

+0

Je pense qu'ils @ Jon ont fait que le code d'un de vos messages précédents: http://stackoverflow.com/questions/2550925/singleton-by-jon-skeet-clarification/2550935#2550935 –

0
  1. Il n'y a pas besoin d'un constructeur statique. SKEET!
  2. Je n'ai jamais entendu parler de ça. Vous ne pouvez pas, évidemment, si la classe est scellée. Mais vous pouvez facilement le réécrire en usine, car il n'y a qu'une seule façon de l'instancier - à travers une propriété. Changez cela en une méthode, et vous avez les débuts d'une usine. La méthode peut renvoyer la même instance à chaque fois, ou renvoyer une instance d'un pool ou faire ce qu'elle veut.

Je ne suggérerais pas que vous possédiez une propriété d'usine, car les propriétés ne devraient pas faire trop de travail.

+4

LOL au * SKEET! * –