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

Quelle est la différence, s’il y en a une, entre un destructeur et une méthode Finalize dans une classe?

J’ai récemment découvert que Visual Studio 2008 considère un destructeur comme une méthode Finalize, ce qui signifie que Visual Studio ne vous permet pas de 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 l’erreur suivante lors de l’appel à finaliser dans le destructeur:

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

Et si l’appel à Finalize est commenté, l’erreur suivante apparaît:

Type ‘ManagementConcepts.Service.TestFinalize’ définit déjà un membre appelé ‘Finalize’ avec les mêmes types de parameters

Un destructeur en C # remplace la méthode System.Object.Finalize . Vous devez utiliser la syntaxe du destructeur pour le faire. Remplacer manuellement Finalize vous donnera un message d’erreur.

Fondamentalement, ce que vous essayez de faire avec votre déclaration de méthode Finalize masque la méthode de la classe de base. Cela obligera le compilateur à émettre un avertissement qui peut être réduit au silence en utilisant le new modificateur (s’il fonctionnait). La chose importante à noter ici est que vous ne pouvez pas à la fois override et déclarer un new membre avec un nom identique en même temps, donc avoir à la fois une méthode destrucsortingce et une méthode Finalize provoquera une erreur (mais vous ne pouvez pas une public new void Finalize() méthode public new void Finalize() si vous ne déclarez pas de destructeur).

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

C # n’a pas vraiment de destructeur “vrai”. La syntaxe ressemble à un destructeur C ++, mais c’est vraiment un finaliseur. Vous l’avez écrit correctement dans la première partie de votre exemple:

 ~ClassName() { } 

Ce qui précède est le sucre syntaxique pour une fonction de Finalize . Cela garantit que les finaliseurs de la base sont garantis, mais est identique à la fonction Finalize . Cela signifie que lorsque vous écrivez la syntaxe du destructeur, vous écrivez vraiment le finaliseur.

Selon Microsoft , le finaliseur fait référence à la fonction appelée par le ramasse-miettes ( Finalize ), tandis que le destructeur est le bit de code qui s’exécute en conséquence (le sucre syntaxique qui devient Finalize ). Ils sont si proches que Microsoft n’aurait jamais dû faire la distinction.

L’utilisation par Microsoft du terme “destructeur” de C ++ est trompeuse, car en C ++, elle est exécutée sur le même thread dès que l’object est supprimé ou sorti de la stack, tandis qu’en C #, il est exécuté sur un thread séparé à un autre moment.

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

  1. Destructeur

    Ce sont des méthodes spéciales qui contiennent du code de nettoyage pour l’object. Vous ne pouvez pas les appeler explicitement dans votre code car ils sont appelés implicitement par GC. En C #, ils ont le même nom que le nom de la classe précédé du signe ~ . Comme-

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

    Dans VB.NET, les destructeurs sont implémentés en substituant la méthode Finalize de la classe System.Object.

  2. Disposer

    Celles-ci sont comme toutes les autres méthodes de la classe et peuvent être appelées explicitement, mais elles ont un but particulier de nettoyer l’object. Dans la méthode dispose, nous écrivons un code de nettoyage pour l’object. Il est important de libérer toutes les ressources non gérées dans la méthode dispose, telles que la connexion à la firebase database, les fichiers, etc. La méthode implémentant la classe doit implémenter l’interface IDisposable. Une méthode Dispose doit appeler la méthode class a desturctor car il a déjà fait le travail pour nettoyer l’object, alors il n’est pas nécessaire que le garbage collector appelle la méthode Finalize de l’object. Référence: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx

  3. Finaliser

    Une méthode Finalize agit comme une sauvegarde pour nettoyer les ressources si votre méthode Dispose n’est pas appelée. Vous devez uniquement implémenter une méthode Finalize pour nettoyer les ressources non managées. Vous ne devez pas implémenter une méthode Finalize pour les objects gérés, car le garbage collector nettoie automatiquement les ressources gérées. La méthode de finalisation est appelée par le GC implicitement, vous ne pouvez donc pas l’appeler à partir de votre code.

    Remarque: En C #, la méthode Finalize ne peut pas être remplacée. Vous devez donc utiliser un destructeur dont l’implémentation interne remplacera la méthode Finalize dans MSIL.

Mise à jour: fil semi-lié intéressant ici .