114 votes

En C #, quelle est la différence entre un destructeur et une méthode Finalize dans une classe?

Quelle est la différence, si elle existe, entre un destructeur et une méthode Finalize dans une classe?

J'ai récemment découvert que Visual Studio 2008 estime un destructeur synonyme d'une méthode Finalize, ce qui signifie que Visual Studio ne vous laisse pas définir simultanément les deux méthodes dans une classe.

Par exemple, le fragment de code suivant:

class TestFinalize
{
    ~TestFinalize()
    {
        Finalize();
    }

    public bool Finalize()
    {
        return true;
    }
}

Donne le message d'erreur suivant sur l'appel à Finaliser dans le destructeur:

L'appel est ambigu entre les méthodes suivantes ou des propriétés: 'TestFinalize.~TestFinalize()' et 'TestFinalize.Finalize()'

Et si l'appel à Finaliser est commenté, il donne l'erreur suivante:

Type 'ManagementConcepts.Service.TestFinalize' définit déjà un membre appelé Compléter avec les mêmes types de paramètres

76voto

Mehrdad Afshari Points 204872

Un destructeur en C# remplace System.Object.Finalize méthode. Vous devez utiliser le destructeur de la syntaxe pour le faire. Annulation manuelle d' Finalize vous donnera un message d'erreur.

Fondamentalement, ce que vous essayer de faire avec votre Finalize déclaration de la méthode est de cacher la méthode de la classe de base. Il fera le compilateur pour émettre un avertissement qui peut être réduit au silence par l' new modificateur (si elle fonctionne). La chose importante à noter ici est que vous ne pouvez pas à la fois override et déclarer new membre avec le même nom dans le même temps, afin d'avoir à la fois un destructeur et un Finalize méthode entraînera une erreur (mais vous pouvez, bien que non recommandé, déclarer public new void Finalize() méthode si vous n'êtes pas déclarer un destructeur).

76voto

Kipp Points 404

C# n'est pas vraiment un "vrai" destructeur. La syntaxe ressemble à un destructeur C++, mais c'est vraiment un outil de finalisation. Vous l'avez écrit correctement dans la première partie de votre exemple:

~ClassName() { }

Le ci-dessus est sucre syntaxique pour Finaliser la fonction. Il s'assure que les finaliseurs dans la base sont garantis à exécuter, mais qui est autrement identique à la redéfinition de la Finaliser la fonction. Cela signifie que lorsque vous écrivez le destructeur de la syntaxe, vous êtes vraiment écrit le finalizer.

Selon Microsoft, le finaliseur se réfère à la fonction que le garbage collector appels lors de la collecte ("Finaliser"), tandis que le destructeur est votre morceau de code qui s'exécute comme un résultat (le sucre syntaxique qui devient "Finaliser"). Ils sont si près d'être la même chose que Microsoft n'a jamais fait la distinction.

L'utilisation par Microsoft de la C++"destructeur" le terme est trompeur, parce qu'en C++ il est exécuté sur le même thread dès que l'objet est supprimé ou sauté hors de la pile, alors qu'en C# il est exécuté sur un thread à un autre moment.

Wikipedia a une bonne discussion sur la différence entre un finaliseur et un destructeur dans le finaliseur article.

21voto

Andrew Siemer Points 7226

Trouvé ici: http://sanjaysainitech.blogspot.com/2007/06/difference-between-destructor-dispose.html

  1. Destructeur

    Ils sont des méthodes spéciales qui contient nettoyage du code pour l'objet. Vous ne pouvez pas appeler explicitement dans votre code comme ils sont appelés implicitement par le GC. En C# ils ont le même nom que le nom de la classe précédé par l' ~ signe. Comme-

    Class MyClass
    {
    
    ~MyClass()
    {
    .....
    }
    }
    

    Dans VB.NET, les destructeurs sont mis en œuvre par des raisons impérieuses le Finaliser la méthode du Système.La classe d'objet.

  2. Disposer

    Ces sont comme toutes les autres méthodes de la classe et peut être appelé explicitement, mais ils ont un but spécial de nettoyage de l'objet. Dans la méthode dispose nous écrire nettoyage du code pour l'objet. Il est important qui nous a libéré de tous les non géré autant de richesses pour l'éliminer méthode comme la connexion de base de données, fichiers, etc. La classe de mise en œuvre de disposer la méthode à mettre en œuvre interface IDisposable.Une méthode dispose doit appeler le GC.SuppressFinalize méthode de l'objet qu'il est l'élimination si la classe a desturctor parce qu'il a déjà fait l' travail pour nettoyer l'objet, alors il n'est pas nécessaire pour la poubelle collecteur pour appeler l'objet de la méthode Finalize. Référence: http://msdn2.microsoft.com/en-us/library/aa720161(SV.71).aspx

  3. Finaliser

    Une méthode Finalize agit en tant que sauvegarde pour nettoyer les ressources dans le si votre méthode dispose est pas appelé. Vous ne devriez mettre en œuvre une méthode Finalize pour nettoyer des ressources non managées. Vous ne devrait pas mettre en œuvre une méthode Finalize pour les objets gérés, parce que le garbage collector nettoie les ressources gérées automatiquement. Finaliser méthode est appelée par le GC implicitement, par conséquent, vous ne pouvez pas appel à partir de votre code.

    Remarque: En C#, de Finaliser la méthode ne peut pas être remplacer, de sorte que vous avez à utilisation destructeur dont la mise en œuvre interne va se substituer à l' Méthode Finalize dans MSIL.Mais dans le VB.NET, de Finaliser la méthode peut être remplacer parce qu'il prend en charge le destructeur de la méthode.

Mise à jour: Intéressant semi-thread ici.

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