83 votes

Différence entre les méthodes destructeur, dispose et finalize

J'étudie le fonctionnement du garbage collector en c#. Je suis confus quant à l'utilisation de Destructor , Dispose y Finalize des méthodes.

D'après mes recherches et ma compréhension, le fait d'avoir une méthode Destructeur dans ma classe indiquera au ramasse-miettes d'effectuer le ramassage des ordures de la manière mentionnée dans la méthode Destructeur qui ne peut pas être appelée explicitement sur les instances de la classe.

En Dispose est destinée à permettre à l'utilisateur de contrôler le ramassage des ordures. La méthode Finalize libère les ressources utilisées par la classe, mais pas l'objet lui-même.

Je ne suis pas sûr d'avoir bien compris. Merci de clarifier vos doutes. Tout lien ou guide supplémentaire est le bienvenu.

74voto

Habib Points 93087

Le destructeur appelle implicitement la méthode Finalize, il s'agit techniquement de la même chose. Dispose est disponible pour les objets qui implémentent l'interface IDisposable.

Vous pouvez voir : Destructeurs C# - MSDN

Le destructeur appelle implicitement Finalize sur la classe de base de l'objet objet.

Exemple tiré du même lien :

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

Le code du destructeur est implicitement traduit par le code suivant :

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

Votre compréhension du destructeur est correcte :

De MSDN

En le programmeur n'a aucun contrôle sur le moment où le destructeur est appelé car c'est le ramasse-miettes qui le détermine . T vérifie les objets qui ne sont plus utilisés par l'application. l'application. S'il considère qu'un objet peut être détruit, il appelle le destructeur (s'il y en a un) et récupère l'objet. appelle le destructeur (le cas échéant) et récupère la mémoire utilisée pour stocker l'objet. l'objet. Les destructeurs sont également appelés lorsque le programme se termine. Il est possible de forcer le ramassage des ordures en appelant Collect, mais la plupart des la plupart du temps, cela devrait être évité car problèmes de performance.

58voto

Marc Gravell Points 482669

En langage C#, un destructeur et un finalisateur sont des concepts fondamentalement interchangeables, et doivent être utilisés pour libérer non géré lorsqu'un type est collecté, par exemple les poignées externes. Il est très rare que vous ayez besoin d'écrire un finalisateur.

Le problème, c'est que le GC n'est pas déterministe, de sorte que le Dispose() (via la méthode IDisposable ) permet de soutenir les déterministe nettoyage. Cette opération n'a rien à voir avec le ramassage des ordures et permet à l'appelant de libérer toutes les ressources. plus tôt . Il peut également être utilisé avec géré (en plus des ressources non gérées), par exemple si vous avez un type qui encapsule (par exemple) une connexion à une base de données, vous voudrez peut-être que l'élimination du type libère également la connexion.

Prograide.com

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.

Powered by:

X