Disposer d'un dictionnaire en C# les meilleures pratiques
J'ai un ConcurrentDictionary dans ma classe session.
La clé est une interface représentant un gérant de classe.
La valeur est une Liste de DataContracts classes qui sont utilisées pour que le gestionnaire au cours de cette session.
Quand j'ai jeter la classe session, je souhaite claire de ce dictionnaire. J'ai besoin d'effacer toutes les valeurs et les clés, mais je ne peux pas jeter les clés - depuis qu'ils existent toujours après la classe jeter..
Est-ce suffisant ? - sera-ce la cause de la GC pour faire le travail ?
_myDictionary = null;
Ou j'ai besoin à la parcourir avec un foreach sur toutes les touches et l'utilisation de la Supprimer pour effacer les valeurs.
Cela suffira. Toutefois, si rien d'autre que le dictionnaire conserve les références aux valeurs, alors bien sûr, les valeurs ne sera pas libéré jusqu'à ce que ceux d'autres références en aller.
OriginalL'auteur ilansch | 2013-06-24
Vous devez vous connecter pour publier un commentaire.
Pourquoi? Si la session de l'instance est en train de devenir admissibles pour la collecte des ordures, et la session est le seul objet qui se réfère au dictionnaire, le dictionnaire de droit pour la collecte des ordures.
C'est presque certainement pas nécessaire. Si rien d'autre a une référence au dictionnaire, puis en définissant que variable
null
n'aura aucun effet. Si rien d'autre n'a une référence au dictionnaire et la session est en train de devenir admissibles pour la collecte des ordures, alors vous n'avez pas besoin de faire tout cela.Le seul moment où il est utile de définir une variable à null pour l'amour de la collecte des ordures, c'est quand que la variable elle-même sera en direct sur (par exemple, c'est une variable d'instance dans un objet qui est pas va être nettoyée, ou c'est une variable statique).
Noter que la collecte des ordures est entièrement distincte de "l'élimination" des objets, par la manière.
Dispose
etIDisposable
sont généralement concernés par non géré ressources, et il n'y a pas d'indication dans votre question, cette notion est pertinente ici.Encore une fois, d'élimination et de collecte des ordures sont séparés. Si rien d'autre ne se réfère à l'instance de la séance, la séance peut être nettoyée. Le fait que la clé n'est pas le garbage collector n'arrête pas le dictionnaire de déchets collectés - la relation n'est pas de la clé pour le dictionnaire, mais dans l'autre sens.
Ok. merci pour la réponse, Ma confusion était depuis je suis également titulaire d'un délégué de rappel au cours de cette session en tant que membre privé, ce délégué doit être mis à null lors de la session éliminés. sinon, une référence existe toujours à partir de la session pour une longue durée de vie de la classe.
OriginalL'auteur Jon Skeet
Vous pouvez appeler
GC.Collect();
à droite après cela, assurez-vous que votre GC est déclenché.GC.Collect
est rarement nécessaire. Laissez-le GC déterminer quand il doit agir (etGC.Collect
ne cause pas la GC à s'exécuter immédiatement, c'est non-déterministe).Il ne va pas aider / faire quelque chose si il n'y a aucune référence sur elle.
OriginalL'auteur Robert