Pourquoi faire appel dispose(false) dans le destructeur?
Ce qui suit est un exemple typique modèle dispose exemple:
public bool IsDisposed { get; private set; }
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!IsDisposed)
{
if (disposing)
{
//perform cleanup here
}
IsDisposed = true;
}
}
~MyObject()
{
Dispose(false);
}
Je comprends ce que jeter le fait, mais ce que je ne comprends pas, c'est pourquoi vous souhaitez appeler en disposer(false) dans le destructeur? Si vous regardez la définition qu'elle ferait absolument rien, alors pourquoi serait-on écrire du code comme celui-ci? Ne serait-il pas logique de juste pas appel de disposer de l'destructeur à tous?
Vous devez vous connecter pour publier un commentaire.
Le finaliseur est utilisé comme une solution de repli si l'objet n'est pas éliminés correctement pour une raison quelconque. Normalement, le
Dispose()
méthode serait appelé, ce qui supprime le finaliseur de branchement et transforme l'objet en un objet géré que le garbage collector peut facilement enlever.Voici un exemple à partir de MSDN d'une classe qui a réussi et les ressources non managées à nettoyer.
Avis que la gestion de ressources ne sont nettoyés si
disposing
est vrai, mais les ressources non managées est toujours nettoyés.Dispose(false)
a exactement rien à faire, vous n'avez donc pas besoin d'un finaliseur ni unDispose(bool)
à tous. Je ressens le modèle standard est trop compliqué de répondre à des cas d'utilisation qui n'a presque jamais se produire (et quand ils le font, ils sont probablement une mauvaise idée). Voici celui que je préfère: nitoprograms.blogspot.com/2009/08/...private void Dispose(bool disposing)
devrait être virtuelIl y a beaucoup plus d'infos dans la “Disposer, à la Finalisation et de la Gestion des Ressources des lignes Directrices de Conception”.
Edit: lien.
Il n'y a pas des destructeurs en C#. C'est un outil de finalisation, ce qui est une chose différente.
La distinction est de savoir si vous avez besoin pour nettoyer des objets gérés ou non. Vous ne voulez pas essayer de les nettoyer dans le finaliseur, comme ils l'ont peut-être été finalisé.
J'ai récemment passé à regarder la Les destructeurs page du Guide de Programmation C#. Il montre que je me suis trompé dans ma réponse ci-dessus. En particulier, il y a une différence entre destructeur et finalizer:
est équivalent à
Je pense que la confusion est due au fait que, dans votre exemple, vous n'êtes pas libérer toutes les ressources non managées. Ces facteurs doivent également être libéré lors de l'dispose est appelé via la collecte des ordures et ils seraient libérés à l'extérieur le vérifier
disposing
. Consultez le site web MSDN exemple concernant la en libérant des ressources non managées. Autre que cela pourrait/devrait se produire à l'extérieur de la case est un appel à toute la classe de base méthode dispose.De la cité l'article:
~Derived() { Dispose(false); }
dérivées ?À l'intérieur du if(disposing) vous êtes censé disposer d'appel/de fermeture sur les objets gérés qui ont des ressources non managées (p. ex. les connexions de base de données).Lorsque le finaliseur est appelé ces objets ne sont plus accessible de sorte que les objets eux-mêmes peuvent être mis au point et vous n'avez pas besoin d'appeler jeter sur eux. Aussi de l'ordre de finalisation est undeterminated de sorte que vous peut-être appeler dispose déjà disposé des objets.
L'exemple suivant montre comment créer une ressource de la classe qui implémente l'interface IDisposable: https://msdn.microsoft.com/en-us/library/System.IDisposable.aspx
En Dispose(bool disposing) fonction: Si l'élimination est égal à true, la méthode a été appelée directement ou indirectement par votre code. Gérés et non gérés, les ressources peuvent être éliminés. Si l'élimination est égal à false, la méthode a été appelée par le moteur d'exécution de l'intérieur de l'outil de finalisation et vous ne devriez pas faire référence à d'autres objets. Seulement les ressources non managées peuvent être éliminés.