Dispose () pour nettoyer les ressources gérées?
Dans cette réponse j'ai trouvé,
De nettoyage les ressources non managées dans la méthode Finalize et la
aménagés dans la méthode dispose, lors de la Jeter/Finaliser le modèle
a été utilisé dans votre code.
Et, plus tard, j'ai trouvé ce joli article à propos de finaliser et d'en disposer et a obtenu une idée claire sur eux. L'article a le code suivant(Page 3), pour expliquer les concepts:
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
//Code to dispose the managed resources of the class
}
//Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Mais en dessous, la même note (que j'ai inclus dans le début de cette question) s'affiche.
Le Jeter/Finaliser Le Modèle
Microsoft vous recommande de mettre en œuvre à la fois de Céder et de Finaliser lorsque l'on travaille avec des ressources non managées. La séquence correcte alors
être un développeur pour appeler dispose. Le Finaliser la mise en œuvre
exécuter et les ressources seraient encore être libérés lorsque l'objet est
les ordures collectées, même si un développeur a négligé d'appel de l'Éliminer
méthode explicite. Francesco Balena écrit dans son blog "la
Jetez/Finaliser le modèle doit être utilisé uniquement lorsque votre appelle
code non managé qui alloue les ressources non managées (y compris les non géré
la mémoire) et retourne un handle que vous devez utiliser finalement à la libération
la ressource. Deux de céder et de finaliser doit chaîne jusqu'à leur parent
les objets en les appelant par leurs parents respectifs méthodes après qu'ils ont
au rebut ou la finalisation de leurs propres membres".
Tout simplement, de nettoyage les ressources non managées dans la méthode Finalize et la gestion de ceux de la méthode dispose, lors de l'
Jetez/Finaliser le modèle a été utilisé dans votre code.
Maintenant, je suis confus de nouveau. Dans l'ensemble de l'article et dans l'exemple de code, il est indiqué que les ressources non managées devrait être libéré dans Dispose()
. Mais alors quelle est la pertinence de ce commentaire?
Edit:
Comme il est confirmé que cette ligne :
Tout simplement, de nettoyage les ressources non managées dans la méthode Finalize et
la gestion de ceux de la méthode dispose, lors de la Jeter/Finaliser
modèle a été utilisé dans votre code
est erroné, j'ai édité cette réponse.
source d'informationauteur Sharun
Vous devez vous connecter pour publier un commentaire.
Voir son très simple.
Dispose
etFinalize
.Dispose
est d'être appelé par les développeurs pour libérer les ressources dès qu'ils voient qu'il n'est plus nécessaire pour eux. Si ils oubliez pas d'appeler laDispose
puis Cadre des appels à la finaliser dans son propre cycle de GC (généralement de son propre temps doux).Finalize
niDispose
.Dispose()
si vous avez créé et conservé une référence à un objet d'un type qui implémenteDispose()
et que vous ne l'avez pas déjà éliminés.Quelques exemples classiques:
System.IO.FileStream
objet gère le verrouillage/flux poignées de fichiers. Donc, il met en œuvre à la fois d'en disposer et de les finaliser. Si le développeur dispose, puis l'autre programme peut accéder tout de suite. S'il oublie de le disposer ensuite Cadre de finaliser et de fermer les poignées plus tard dans son cycle de GC.System.Text.StringBuilder
dose n'ont aucune ressource non managée. Donc, ne jetez pas finaliser.Autant que le modèle est préoccupé de ce que signifie
est que d'appeler les méthodes dispose de tout .NET les objets que vous avez en tant que composants à l'intérieur de cette classe
Et
Moyens pour fermer la crue des poignées et des pointeurs. Voici votre code mis à jour avec des exemples
Voici une vieille question expliquer
Si un
Foo
a des ressources qui pourront bénéficier de nettoyage déterministe, mais aucun qui peuvent utilement être nettoyé dans un finaliseur, il doit mettre en œuvreIDisposable
mais ne devrait pas remplacerFinalize
ou avoir un destructeur. Si une classe contient de multiples ressources, et au moins on peut être nettoyé dans un finaliseur, puis chaque discret des ressources qui pourraient être nettoyé dans un finaliseur doit être encapsulé dans son propre outil de finalisation/destructeur équipé de l'objet (qui peut être défini dans un cadre protégé classe imbriquée), et la classe qui contient ces ressources devraient contenir des références à l'emballage des objets. Une fois que c'est fait, que l'extérieur de la classe d'adapter le modèle pour les classes avec unDispose
méthode mais pas finaliseur/destructeur.