Quelle est la différence, s'il y en a une, entre un destructeur et une méthode Finalize dans une classe?En C#, quelle est la différence 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 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:
The call is ambiguous between the following methods or properties: 'TestFinalize.~TestFinalize()' and 'TestFinalize.Finalize()'
Et si l'appel à Finaliser est commenté, il donne l'erreur suivante:
Type 'ManagementConcepts.Service.TestFinalize' already defines a member called 'Finalize' with the same parameter types
'Vous ne devez implémenter une méthode Finalize pour nettoyer les ressources non managées': vous l'avez mis dans Finalize. Idem avec Dispose? – hqt
@hqt: Les cas où l'on devrait implémenter 'Dispose' sont largement plus nombreux que ceux où l'on devrait implémenter un finaliseur. Implémentez 'Dispose' s'il est probable qu'une instance de la classe ou d'une classe dérivée soit la dernière à posséder directement une ressource non gérée, ou à posséder directement la dernière chose pour posséder directement une ressource non gérée, ou posséder directement la dernière chose Pour mettre directement à jour Finalize pour le nettoyage des ressources si sa classe directement possède une ressource non gérée et presque rien d'autre - un scénario beaucoup plus étroit. – supercat
@hqt: Si une classe possède directement des ressources non gérées et détient également des références à d'autres objets, les ressources non managées doivent généralement être divisées en leur propre classe finalisable (qui ne devrait idéalement contenir aucune référence), ce qui signifie Une classe qui détient des références à d'autres objets ne posséderait que des «choses qui possèdent directement des ressources non gérées», plutôt que de posséder les ressources elles-mêmes, et n'aurait donc pas besoin d'un finaliseur. – supercat