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 ?
Quand dois-je créer manuellement un destructeur ?
Presque jamais.
Typiquement, on ne crée un destructeur que lorsque votre classe retient une ressource coûteuse non gérée qui doit être nettoyée lorsque l'objet disparaît. Il est préférable d'utiliser le pattern disposable 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 s'en débarrasser, la ressource sera quand même nettoyée. (Peut-être.)
Si vous faites un destructeur être extrêmement prudent y comprendre le fonctionnement du garbage collector . Les destructeurs sont vraiment bizarre :
Presque rien de ce qui est normalement vrai ne l'est dans un destructeur. Soyez vraiment, vraiment prudent. Il est très difficile d'écrire un destructeur correct.
Quand avez-vous eu besoin de créer un destructeur ?
En testant la partie du compilateur qui gère les destructeurs. Je n'ai jamais eu besoin de le faire dans du code de production. J'écris rarement des objets qui manipulent des ressources non gérées.
Le langage C# les appelle "destructors", mais la plupart des gens les appellent "finalizers" car c'est leur nom .NET et cela réduit la confusion avec les destructors C++ (qui sont très différents).
Comment implémenter IDisposable et Finalizers : 3 règles simples
C'est ce qu'on appelle un "finaliseur", et vous ne devriez généralement en créer un que pour une classe dont l'état (c'est-à-dire les champs) comprend des ressources non gérées (c'est-à-dire des pointeurs vers des handles récupérés via des appels p/invoke). Cependant, à partir de la version 2.0 de .NET, il existe une meilleure façon de gérer le nettoyage des ressources non gérées : SafeHandle . Ainsi, vous n'aurez pratiquement plus jamais besoin d'écrire un finaliseur.
Il s'agit d'un destructeur/finaliseur, généralement créé lors de l'implémentation du modèle Disposed.
Il s'agit d'une solution de repli lorsque l'utilisateur de votre classe oublie d'appeler Dispose, pour s'assurer que (finalement) vos ressources sont libérées, mais vous n'avez aucune garantie quant au moment où le destructeur est appelé.
Dans ce Question sur Stack Overflow la réponse acceptée montre correctement comment implémenter le pattern dispose. Cela n'est nécessaire que si votre classe contient des ressources non gérées que le ramasseur d'ordures ne parvient pas à nettoyer lui-même.
Une bonne pratique consiste à ne pas implémenter un finaliseur sans donner également à l'utilisateur de la classe la possibilité de disposer manuellement de l'objet pour libérer immédiatement les ressources.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.