~ est le destructor
- Destructeurs sont invoquées automatiquement et ne peut être invoquée explicitement.
- Les destructeurs ne peuvent pas être surchargés. Ainsi, une classe peut avoir, au plus, un destructeur.
- Les destructeurs ne sont pas hérités. Ainsi, une classe n'a pas d'autres destructeurs que celui qui peut y être déclaré.
- Les destructeurs ne peuvent pas être utilisés avec des structures. Ils ne sont utilisés qu'avec des classes. Une instance devient éligible à la destruction lorsqu'il n'est plus possible pour aucun code d'utiliser l'instance.
- L'exécution du destructeur pour l'instance peut avoir lieu à tout moment après que l'instance est devenue éligible à la destruction.
- Lorsqu'une instance est détruite, les destructeurs de sa chaîne d'héritage sont appelés, dans l'ordre, du plus dérivé au moins dérivé.
Finaliser
En C#, la méthode Finaliser effectue les opérations qu'une norme C++ destructor ferait. En C#, vous ne le nommez pas Finalize - vous utilisez la syntaxe destructeur C++ de placer un symbole tilde (~) avant le nom de la classe.
Jeter
Il est préférable de disposer d'objets dans une méthode Close()
ou Dispose()
qui peut être appelé explicitement par l'utilisateur de la classe. Finaliser (destructeur) sont appelés par le GC.
L'interface IDisposable indique au monde que votre classe contient des ressources qui doivent être éliminées et offre aux utilisateurs un moyen de les libérer. Si vous devez implémenter un finaliseur dans votre classe, votre méthode Dispose doit utiliser la méthode GC.SuppressFinalize()
pour vous assurer que la finalisation de votre instance est supprimée.
Que utiliser?
Il n'est pas légal d'appeler un destructeur explicitement. Votre destructeur sera appelé par le garbage collector. Si vous manipulez de précieuses ressources non managées (telles que des handles de fichiers) que vous souhaitez fermer et éliminer le plus rapidement possible, vous devez implémenter l'interface IDisposable.
Je ne sais pas comment c'était dans le passé. Mais maintenant les destructeurs sont hérités. Consultez ce lien pour plus d'informations (consultez l'exemple à la fin): http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx – RononDex
@RononDex point 3 de la page même que vous liez aux états * "Finalizers ne peut pas être hérité "*, ce qui contredit votre commentaire. C'est un peu confus car, même s'ils ne peuvent pas être hérités *, la méthode 'Finalize' est appelée de façon récursive pour toutes les instances de la chaîne d'héritage, du plus dérivé au moins dérivé" *. Notez que ce n'est pas le même comportement que celui que vous obtiendriez des destructeurs hérités. –
@MarkAmery ah je vois, donc fondamentalement ils sont appelés dans l'ordre inverse par rapport à quelque chose qui est hérité? – RononDex