Par exemple:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Quand dois-je créer manuellement un destructeur? Quand avez-vous eu besoin de créer un destructeur?
Par exemple:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Quand dois-je créer manuellement un destructeur? Quand avez-vous eu besoin de créer un destructeur?
Réponses:
MISE À JOUR: Cette question a fait l'objet de mon blog en mai 2015 . Merci pour la bonne question! Consultez le blog pour une longue liste de mensonges que les gens croient généralement à propos de la finalisation.
Quand dois-je créer manuellement un destructeur?
Presque jamais.
En règle générale, on ne crée un destructeur que lorsque votre classe conserve une ressource non gérée coûteuse qui doit être nettoyée lorsque l'objet disparaît. Il est préférable d'utiliser le modèle jetable pour s'assurer que la ressource est nettoyée. Un destructeur est alors essentiellement une assurance que si le consommateur de votre objet oublie de le supprimer, la ressource finit toujours par être nettoyée. (Peut être.)
Si vous créez un destructeur, soyez extrêmement prudent et comprenez comment fonctionne le garbage collector . Les destructeurs sont vraiment bizarres :
Presque rien de ce qui est normalement vrai n'est vrai dans un destructeur. Soyez vraiment très prudent. Ecrire un destructeur correct est très difficile.
Quand avez-vous eu besoin de créer un destructeur?
Lors du test de la partie du compilateur qui gère les destructeurs. Je n'ai jamais eu besoin de le faire dans le code de production. J'écris rarement des objets qui manipulent des ressources non gérées.
C'est ce qu'on appelle un "finaliseur", et vous ne devriez généralement en créer qu'un pour une classe dont l'état (ie: champs) inclut des ressources non managées (c'est-à-dire: des pointeurs vers des descripteurs récupérés via des appels p / invoke). Cependant, dans .NET 2.0 et versions ultérieures, il existe en fait un meilleur moyen de gérer le nettoyage des ressources non gérées: SafeHandle . Compte tenu de cela, vous ne devriez pratiquement plus jamais avoir besoin d'écrire un finaliseur.
Vous n'en avez pas besoin, sauf si votre classe gère des ressources non gérées comme les descripteurs de fichiers Windows.
Il s'appelle un destructeur / finaliseur et est généralement créé lors de l'implémentation du modèle Disposed.
C'est une solution de secours lorsque l'utilisateur de votre classe oublie d'appeler Dispose, pour s'assurer que (éventuellement) vos ressources sont libérées, mais vous n'avez aucune garantie quant au moment où le destructeur est appelé.
Dans cette question de Stack Overflow , la réponse acceptée montre correctement comment implémenter le modèle d'élimination. Ceci n'est nécessaire que si votre classe contient des ressources non gérées que le garbage collector ne parvient pas à nettoyer lui-même.
Une bonne pratique consiste à ne pas implémenter de finaliseur sans donner également à l'utilisateur de la classe la possibilité de supprimer manuellement l'objet pour libérer les ressources immédiatement.
Lorsque vous avez des ressources non gérées et que vous devez vous assurer qu'elles seront nettoyées lorsque votre objet disparaîtra. Un bon exemple serait les objets COM ou les gestionnaires de fichiers.
J'ai utilisé un destructeur (à des fins de débogage uniquement) pour voir si un objet était purgé de la mémoire dans le cadre d'une application WPF. Je ne savais pas si le garbage collection purgeait vraiment l'objet de la mémoire, et c'était un bon moyen de vérifier.
Les destructeurs fournissent un moyen implicite de libérer des ressources non managées encapsulées dans votre classe, ils sont appelés lorsque le GC s'y déplace et ils appellent implicitement la méthode Finalize de la classe de base. Si vous utilisez beaucoup de ressources non gérées, il est préférable de fournir un moyen explicite de libérer ces ressources via l'interface IDisposable. Consultez le guide de programmation C #: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx