C# à l'AIDE du mot-clé - quand et quand ne pas l'utiliser?
J'aimerais savoir quand je doit et ne doit pas être enveloppant les choses dans un bloc using.
De ce que je comprends, le compilateur traduit dans un try/finally, où l'appelle enfin dispose() sur l'objet.
J'ai toujours utiliser de l'AIDE autour de connexions de base de données et l'accès aux fichiers, mais plus par habitude plutôt que 100% de compréhension. Je sais que vous devez explicitement (ou avec une aide) Dispose() des objets qui contrôle les ressources, afin de s'assurer qu'ils sont publiés instantanément plutôt que chaque fois que le CLR se sent comme elle, mais c'est là que ma compréhension de tomber en panne.
Sont IDisposables ne sont pas éliminés lorsqu'ils passent hors de portée?
Dois-je seulement besoin d'utiliser une AIDE lors de mon objet fait usage de Disposer de mettre de l'ordre lui-même?
Grâce
Edit: je sais qu'il ya une couple d'autres postes à l'AIDE de mots clés, mais je suis plus intéressé par les réponses concernant le CLR et exactement ce qui se passe en interne
Andrew
Vous devez vous connecter pour publier un commentaire.
Non,
IDisposable
éléments ne sont pas éliminés lorsqu'ils passent hors de portée. C'est précisément pour cette raison que nous avons besoin deIDisposable
- pour le nettoyage déterministe.Ils finalement obtenir des ordures collectées, et si il y a un finaliseur il sera (peut-être) être nommé - mais cela pourrait être une longue période dans le futur (pas bon pour les pools de connexions, etc). La collecte des ordures est dépendante de la pression de la mémoire - si rien ne veut plus de mémoire, il n'est pas nécessaire d'exécuter un cycle de GC.
Intéressante (peut-être), il y a certains cas où "l'aide" est une douleur lors de la délinquance de la classe déclenche une exception sur
Dispose()
parfois. WCF est un délinquant de cette. J'ai discuté de ce sujet (avec une solution de contournement simple) ici.Fondamentalement, - si la classe implémente
IDisposable
, et vous propre une instance (c'est à dire que vous l'avez créé ou que ce soit), c'est votre travail pour s'assurer qu'il obtient éliminés. Cela peut signifier par "utilisation", ou cela peut signifier de passer à un autre morceau de code qui en assume la responsabilité.Fait, j'ai vu le code de débogage du type:
(où le
Dispose
appelsGC.SuppressFinalize
)Pas. Si la IDisposable l'objet est finalisable, ce qui n'est pas la même chose, alors il sera finalisée lorsque c'est le garbage collector.
Qui pourrait être bientôt ou peut-être presque jamais.
Jeff Richter C#/CLR livre est très bien tout ça, et dans le Cadre des Directives de Conception de l'ouvrage est également utile.
Vous pouvez seulement utiliser "utiliser" lorsque l'objet implémente IDisposable. Le compilateur objet si vous essayez de faire autrement.
Pour ajouter d'autres réponses, vous devez utiliser
using
(ou explicite Disposer) chaque fois qu'un objet possède des ressources autres que la mémoire gérée. Les exemples pourraient être des choses comme des fichiers, des sockets, des connexions de base de données, ou même RIB poignées de dessin.Le garbage collector finirait par point de ces objets, mais seulement à un quelconque moment dans l'avenir. Vous ne pouvez pas compter sur elle passe en temps opportun, et vous pouvez exécuter de cette ressource dans le temps.