Dans l'exemple de code fourni, l'instance singleton sera créée au moment du premier accès à la classe. Cela signifie pour votre exemple au moment où Instance
est appelé pour la première fois.
un aperçu plus concret que vous trouverez dans l'article de Jon Skeet Implementing the Singleton Pattern in C#, voir méthode 4.
En gros, afin d'obtenir un comportement vraiment paresseux quelque chose comme
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton(){}
private Singleton(){}
public static Singleton Instance
{
get { return instance; }
}
}
est suffisant.
(Mais de toute façon, la pleine et bien meilleure vue d'ensemble se trouve dans l'article mentionné.)
EDIT
En fait, comme il ressort de l'article mentionné, l'instance n'est pas garanti à créer au premier accès, à cause de la marque BeforeFiledInit. Vous devez ajouter un constructeur statique vide, de cette façon il est garanti d'être paresseux. Sinon, l'instance sera créée à un moment indéterminé entre le démarrage du programme et le premier accès. (Runtime .NET 2.0 est connu pour avoir une stratégie plus avide, de sorte que vous obtiendrez probablement pas le comportement paresseux.)
Je cite ledit article:
La paresse est de type initializers ne peut être garanti par .NET lorsque le type n'est pas marqué avec un drapeau spécial appelé beforefieldinit
. Malheureusement, le compilateur C# marque [...] tous les types qui n'ont pas de constructeur statique comme beforefieldinit
.
EDIT 2
Si vous voulez que l'objet singleton pour nettoyer, vous devez inclure cette fonctionnalité dans la classe Singleton
elle-même.
La suppression de la valeur de la propriété fera en sorte que votre classe ne sera plus un singleton! Imaginez que quelqu'un accède au singleton et obtient l'instance singleton. Après cela, vous définissez la propriété à null
. L'objet existant de la classe Singleton
ne disparaîtra pas, car il y a toujours une référence! Ainsi, la prochaine fois que vous accéderez à la propriété Instance
, une autre instance de la classe Singleton
sera créée. Donc vous avez perdu deux choses: votre objet n'est plus un singleton (parce que vous avez deux instances existantes en même temps), et la mémoire n'a pas été effacée non plus.
* forme de l'instanciation paresseux * dit tout – V4Vendetta
Où est-ce que (très mal) 'set {}' viennent? –
Votre deuxième question est tellement logique. – CodesInChaos