GC.SuppressFinalize doit-il être appelé sur des objets ne disposant pas de finaliseur?

StackOverflow https://stackoverflow.com/questions/621152

  •  05-07-2019
  •  | 
  •  

Question

Pour une raison quelconque, FXCop semble penser Je devrais appeler GC.SuppressFinalize in Dispose, que je dispose ou non d’un finaliseur.

Est-ce que je manque quelque chose? Existe-t-il une raison d'appeler GC.SuppressFinalize sur des objets pour lesquels aucun finaliseur n'est défini?

Était-ce utile?

La solution

Il existe toujours un finaliseur dans IL - System.Object.Finalize () existe dans chaque classe. Par conséquent, si vous créez une classe personnalisée, vous devez supprimer un finaliseur. Cela étant dit, tous les objets ne sont pas placés dans la file d'attente de finalisation. Vous devez donc techniquement supprimer la finalisation si vous implémentez votre propre finaliseur.

Si vous implémentez IDisposable pour encapsuler des ressources non gérées, vous devez inclure un finaliseur et empêcher son exécution, car en théorie, vous effectuez déjà le nettoyage lorsque Dispose est appelé.

Autres conseils

Il n'est pas nécessaire d'appeler GC.SuppressFinalize (this) dans Dispose, sauf si:

  • Vous êtes la classe de base qui implémente les méthodes Dispose virtuelles destinées à être remplacées (encore une fois, cela ne relève peut-être pas de votre responsabilité, même ici, mais vous pouvez le faire dans ce cas)
  • Vous avez vous-même un finaliseur. Techniquement, chaque classe de .NET a un finaliseur, mais si le seul finaliseur présent est celui de Object , alors l'objet n'est pas considéré comme devant être finalisé et n'est pas mis sur la liste de finalisation lors de la prise de contrôle

Je dirais, si vous n'avez aucun des cas ci-dessus, que vous pouvez ignorer ce message en toute sécurité.

Tous les objets ont une méthode de finalisation, même si vous n'en avez pas implémentée à l'aide d'un destructeur c # (ce qui n'est pas vraiment garanti d'être appelé par le GC). Si vous avez implémenté IDisposable, c’est une bonne pratique que de supprimer l’appel car cela signifie que vous avez décidé d’effectuer la finalisation de manière explicite.

article de devx

Je ne vois pas la nécessité d'appeler SuppressFinalize () s'il n'y a pas de finaliseur défini. Si vous voulez être sur la défensive, il peut être intéressant de disposer d'un finaliseur et de Dispose (). Vous n'avez donc pas besoin de compter sur les clients pour toujours appeler Dispose (). Ensuite, vous ne perdrez pas de ressources quand ils oublieront.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top