En C # Quelle est la différence entre un destructor et une méthode Finaliser dans une classe?
-
21-08-2019 - |
Question
Quelle est la différence, si elle existe, entre un destructor et une méthode Finaliser dans une classe?
J'ai récemment découvert que Visual Studio 2008 considère un destructor synonyme d'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 sur l'appel à Finaliser dans le destructor:
L'appel est ambigu entre les méthodes ou les propriétés suivantes: '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é « Finaliser » avec les mêmes types de paramètres
La solution
A destructor dans la méthode C # des substitutions System.Object.Finalize
. Vous doivent utilisez la syntaxe destructor pour le faire. Annulation manuelle vous donnera Finalize
un message d'erreur.
En fait ce que vous essayez de faire avec votre déclaration de méthode est new
cacher la méthode de la classe de base. Il provoque le compilateur d'émettre un avertissement qui peut être réduit au silence à l'aide du modificateur override
(si elle allait travailler). La chose importante à noter ici est que vous ne peut pas à la fois et public new void Finalize()
déclarez un membre <=> ayant le même nom en même temps pour avoir à la fois une destructor et une méthode entraînera <=> une erreur (mais vous peut , mais pas recommandé, déclarer une méthode si vous <=> ne pas déclarer une destructor).
Autres conseils
Wikipedia a une bonne discussion sur la différence entre un finaliseur et un destructor dans l'article finaliseur.
C # n'a vraiment pas destructor "true". La syntaxe ressemble à un C ++ destructor, mais il est vraiment un finaliseur. Vous avez écrit correctement dans la première partie de votre exemple:
~ClassName() { }
Ce qui précède est du sucre syntaxique pour une fonction Finalize
. Il veille à ce que les finaliseurs dans la base sont garantis pour fonctionner, mais est par ailleurs identique à la substitution de la fonction <=>. Cela signifie que lorsque vous écrivez la syntaxe destructor, vous écrivez vraiment le finaliseur.
Selon Microsoft , le finaliseur fait référence à la fonction que la garbage collector appelle quand il recueille (<=>), tandis que le destructor est votre morceau de code qui exécute en conséquence (le sucre syntaxique qui devient <=>). Ils sont si près d'être la même chose que Microsoft aurait jamais fait la distinction.
L'utilisation de Microsoft terme « destructor » du C ++ est trompeur, car en C ++ est exécuté sur le même fil que dès que l'objet est supprimé ou sauté de la pile, alors que dans C # est exécuté sur un thread séparé à un autre temps.
Destructeur
Ce sont des méthodes spéciales qui contient le code pour nettoyer l'objet. Vous ne pouvez pas les appeler explicitement dans votre code comme on les appelle implicitement par GC. En C #, ils ont le même nom que le nom de la classe a précédé par le signe
~
. Comme -Class MyClass { ~MyClass() { ..... } }
Dans VB.NET, sont mises en œuvre par Destructeurs redéfinissant la Finaliser Procédé de la classe System.Object.
Éliminez
Ce sont comme tous les autres méthodes de la classe et peuvent être appelés explicitement mais ils ont un but spécial de nettoyage l'objet. Dans la méthode Éliminez nous écrivons nettoyer le code pour l'objet. Il est important que nous avons libéré toutes les recources non gérés dans le Éliminez méthode comme la connexion de base de données, fichiers, etc. La classe implémentant disposer méthode devrait mettre en œuvre IDisposable interface.Un méthode Dispose devrait appeler la méthode GC.SuppressFinalize pour l'objet est disposer si la classe a desturctor parce qu'il a déjà fait la travail pour nettoyer l'objet, il n'est pas nécessaire pour les ordures collecteur pour appeler la méthode Finalize de l'objet. Référence: http://msdn2.microsoft.com/en-us /library/aa720161(VS.71).aspx
Finaliser
Une méthode Finaliser agit comme une garantie pour nettoyer les ressources dans le Si votre méthode Dispose est pas appelé. Vous ne devriez mettre en œuvre une méthode Finaliser pour nettoyer les ressources non gérés. Toi ne devrait pas mettre en œuvre une méthode Finaliser pour les objets gérés, parce que le garbage collector nettoie automatiquement les ressources gérées. Finaliser méthode est appelée par le GC, vous pouvez donc pas implicitement appeler à partir de votre code.
Remarque: En C #, Finaliser méthode ne peut pas être prioritaire, donc vous devez utiliser destructor dont la mise en œuvre interne remplacera la Finaliser méthode MSIL.But dans le VB.NET, Finaliser méthode peut être remplacer car elle prend en charge la méthode destructor.
Mise à jour:. Intéressant fil semi-lié