Vous ne devez inclure un finaliseur que si a absolument pour effectuer un nettoyage à un moment donné, qu'il soit exécuté explicitement ou non. Dans de tels cas, vous devriez toujours avoir un moyen explicite d'effectuer le nettoyage en temps opportun de toute façon, et cela devrait supprimer la finalisation de toute façon, afin que les «bons» clients ne voient aucune pénalité de performance.
Vous normalement besoin d'un finaliseur si vous avez une poignée directe aux ressources non gérés - si vous avez seulement une référence à une autre classe qui a une poignée sur la ressource (par exemple FileStream
) alors vous devriez laisser à la autre classe pour avoir un finaliseur.
Avec l'avènement de SafeHandle
dans .NET 2.0, les situations où il vaut la peine d'écrire votre propre finaliseur sont very rare indeed. La pénalité de performance des finaliseurs est qu'ils font vivre vos objets plus longtemps qu'ils n'en ont besoin: dans le premier cycle du GC où ils sont considérés comme éligibles à la collecte, ils sont placés dans la file d'attente du la prochaine génération comme tout autre objet qui survit à un cycle GC. Le finaliseur s'exécutera ensuite dans un autre thread (à un moment donné) et seulement puis seront-ils éligibles pour être réellement collectés. Donc, au lieu de (disons) être recueillis dans la première collection gen1, ils vivent sur cette collection jusqu'à la prochaine gen2, ce qui peut être considérablement plus tard.
Oui, dommage que même la version Fx4 de ce lien ne mentionne pas SafeHandle. –
Une pénalité de performance plus importante est que tous les objets référencés par un objet finalisable ne seront pas collectables pour une autre génération, de même que tous les objets référencés par ceux-ci, ou les objets référencés par ceux-ci, etc. Si un objet référence, directement ou indirectement , objets qui ne seront pas nécessaires lors de la finalisation, l'objet ne doit pas avoir de finaliseur. Au lieu de cela, les choses qui sont réellement nécessaires pour la finalisation devraient être encapsulées dans leur propre classe finalisable, et l'objet plus grand devrait contenir une référence à cela. – supercat