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?
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?
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.
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.
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.
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é.
Finaliser
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éthodeDisposer
IDisposable
sur tous les type qui a un finaliseurDispose
méthode. En d'autres termes, éviter l'utilisation d'un objet après l' Dispose
méthode a été appelée sur elle.Dispose
sur tous IDisposable
types une fois que vous avez terminé avec euxDispose
à être appelé plusieurs fois sans la levée des erreurs.Dispose
méthode à l'aide de l' GC.SuppressFinalize
méthodeDispose
méthodesJetez/Finalisé Modèle
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.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 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.