252 votes

Finaliser vs Disposer

Pourquoi certaines personnes utilisent l' Finalize méthode par rapport à l' Dispose méthode?

Dans quelles situations vous utilisez l' Finalize méthode par rapport à l' Dispose méthode et vice-versa?

162voto

Samuel Points 21085

Le finaliseur méthode est appelée lorsque l'objet est d'ordures collectées et vous n'avez aucune garantie quand à ce qui va se passer (vous pouvez le forcer, mais il va nuire à la performance).

L' Dispose méthode sur l'autre main est destinée à être appelée par le code de la création de votre classe, de sorte que vous pouvez nettoyer et libérer toutes les ressources que vous avez acquis (non géré données, de connexions de base de données, les descripteurs de fichiers, etc), le moment où le code est fait avec votre objet.

La pratique courante est de mettre en oeuvre IDisposable et Dispose , de sorte que vous pouvez utiliser votre objet en using de tresorerie. Comme l' using(var foo = new MyObject()) { }. Et dans votre outil de finalisation, vous appelez Dispose, juste au cas où le code d'appel a oublié de disposer de vous.

132voto

Brian Rasmussen Points 68853

D'autres ont déjà couvert la différence entre Dispose et Finalize (btw l' Finalize méthode est encore appelé un destructeur dans la spécification du langage), donc je vais juste ajouter un peu plus sur les scénarios où l' Finalize méthode est très pratique.

Certains types encapsule des ressources disponibles d'une manière où il est facile à utiliser et d'en disposer en une seule action. L'utilisation générale est souvent comme ça. Ouvrir, lire ou écrire, fermer (Disposer). Il s'adapte très bien avec l' using construire.

D'autres sont un peu plus difficile. WaitEventHandles pour les instances ne sont pas utilisés comme ils sont utilisés pour le signal à partir d'un thread à l'autre. La question devient alors qui devrait en appeler Dispose sur ces? En tant que sauvegarde des types comme ces mettre en œuvre un Finalize méthode, qui permet de s'assurer les ressources sont éliminés lors de l'instance n'est plus référencé par l'application.

76voto

itowlson Points 44174

Finaliser l'est de la butte de méthode, appelée par le garbage collector quand il récupère un objet. Disposer est le "nettoyage déterministe" la méthode, appelée par les applications pour libérer de précieuses ressources autochtones (poignées de fenêtre, de connexions de base de données, etc.) quand ils ne sont plus nécessaires, plutôt que de les laisser tenu indéfiniment jusqu'à ce que le GC devient tour à l'objet.

En tant qu'utilisateur d'un objet, vous utilisez toujours la Jeter. Finaliser est pour le GC.

Comme le responsable de l'implémentation d'une classe, si vous avez géré les ressources qui doivent être éliminés, vous mettez en œuvre les Éliminer. Si vous détenez des ressources natives, vous mettez en œuvre à la fois d'en Disposer et de les Finaliser, et à la fois appeler une méthode commune qui libère les ressources autochtones. Ces idiomes sont généralement combinés par un privé dispose(bool disposing) méthode, qui mettent fin à des appels avec le vrai, et de Finaliser les appels avec la faux. Cette méthode libère toujours natif de ressources, puis vérifie l'élimination de paramètre, et si il est vrai qu'elle dispose de ressources managées et les appels GC.SuppressFinalize.

51voto

Bhushan Bhangale Points 6284

Finaliser est appelée par la GC, cet objet n'est plus utilisé.

Disposer est juste une méthode normale que l'utilisateur de cette classe peuvent faire appel à la libération des ressources.

Si l'utilisateur a oublié d'appeler dispose et si la classe Finaliser la mise en œuvre puis GC assurez-vous qu'il est appelé.

43voto

GenZiy Points 294

Finaliser

  • Les finaliseurs doit toujours être protected, pas public ou private de sorte que la méthode ne peut être appelée à partir de l'application du code directement et dans le même temps, il peut faire un appel à l' base.Finalize méthode
  • Les finaliseurs devrait libérer des ressources non managées.
  • Le cadre ne garantit pas qu'un finaliseur exécutera sur une instance donnée.
  • Jamais allouer de la mémoire dans les finaliseurs ou appeler des méthodes virtuelles à partir des outils de finalisation.
  • Éviter de synchronisation et de soulever les exceptions non gérées dans les finaliseurs.
  • L'ordre d'exécution des finaliseurs est non-déterministe-en d'autres termes, vous ne pouvez pas compter sur un autre objet encore disponibles au sein de votre outil de finalisation.
  • Ne pas définir les finaliseurs sur les types de valeur.
  • Ne pas créer de vide destructeurs. En d'autres termes, vous ne devriez jamais explicitement définir un destructeur, à moins que votre classe doit nettoyer les ressources non managées et si vous ne définissez un, il devrait faire un peu de travail. Si, plus tard, vous n'avez plus besoin de nettoyer les ressources non managées dans le destructeur, retirez-le complètement.

Disposer

  • Mettre en oeuvre IDisposable sur tous les type qui a un finaliseur
  • S'assurer que l'objet est inutilisable après avoir fait un appel à l' Dispose méthode. En d'autres termes, éviter l'utilisation d'un objet après l' Dispose méthode a été appelée sur elle.
  • Appelez Dispose sur tous IDisposable types une fois que vous avez terminé avec eux
  • Autoriser Dispose à être appelé plusieurs fois sans la levée des erreurs.
  • Supprimer les appels ultérieurs à l'outil de finalisation de l'intérieur de l' Dispose méthode à l'aide de l' GC.SuppressFinalize méthode
  • Éviter de créer des jetables types de valeur
  • Éviter de jeter des exceptions à l'intérieur d' Dispose méthodes

Jetez/Finalisé Modèle

  • Microsoft vous recommande de mettre en œuvre les deux Dispose et Finalize lorsque l'on travaille avec des ressources non managées. L' Finalize mise en œuvre exécuter et les ressources seraient encore être libérés lorsque l'objet est d'ordures collectées, même si un développeur a négligé d'en appeler l' Dispose méthode explicite.
  • Nettoyage les ressources non managées dans l' Finalize méthode de ainsi que Dispose méthode. En outre appeler l' Dispose méthode pour toute .NET les objets que vous avez en tant que composants à l'intérieur de la classe(ayant des ressources non managées comme leurs membres) de l' Dispose méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X