Question

GC est pour les objets gérés et Finaliser est pour les objets non gérés thats ce que je suis en train de lire. Dispose est implicite et explicite est Finaliser est ce que je suis en train de lire. Quelqu'un peut-il me donner un exemple d'un module dans lequel les trois choses ont été utilisées pour différentes raisons?

Était-ce utile?

La solution

GC est la collecte des ordures. Il est la gestion automatique de la mémoire, qui gère le nettoyage des objets alloués sur le tas géré. Le .NET GC utilise un algorithme de marquage et de balayage. Lorsqu'une collecte des ordures se produit, il considère essentiellement tout objet dans la partie du tas à nettoyer comme recouvrable. Ensuite, il passe par un processus de marquage où il recherche les racines. C'est à dire. il identifie les objets qui sont encore utilisés par l'application. Ayant fait que les objets restants sont éligibles pour le nettoyage. Le tas peut être compactée dans le cadre du nettoyage.

Dispose et méthodes finaliseur les deux offrent une option pour les ressources de nettoyage, qui sont pas GC traitées par. Par exemple. cela pourrait être des poignées natives et autres. Ils ont rien à voir avec la mémoire sur la récupération du tas managé.

Dispose doit être appelé explicitement sur un type qui mettent en œuvre IDisposable. Il peut être appelé soit par la méthode Dispose() lui-même ou par la construction de using. Le GC ne sera pas automatiquement appel Éliminez.

Un finaliseur ou destructor (comme la spécification du langage qu'il appelle) d'autre part, seront automatiquement appelés quelque temps après que l'objet était admissible pour le nettoyage. Finaliser procédés sont exécutées de façon séquentielle sur un fil dédié.

Dispose() permet le nettoyage déterministe des ressources alors qu'un finaliseur peut agir comme un filet de sécurité au cas où l'utilisateur ne remet pas Dispose().

Si un type implémente un finaliseur, le nettoyage des cas est retardée Finalizer doit être appelé avant le nettoyage. C'est à dire. il faudra une somme supplémentaire pour récupérer la collectionnez mémoire pour les instances du type. Si le type implémente IDisposable ainsi, la méthode Dispose peut être appelé et l'instance peut se retirer de la finalisation. Cela permettra à l'objet à nettoyer comme si elle n'avait pas de finaliseur.

Si vous voulez creuser dans cela, je recommande CLR via C # par Jeffrey Richter . Il est un grand livre et couvre tous les détails sordides de ce (je suis parti un certain nombre de détails). La nouvelle 3ème édition vient de sortir.

Autres conseils

L'un des avantages de .NET est le garbage collector. Dans de nombreuses langues, chaque morceau de mémoire doit être gérée par la Developer- mémoire allouée devrait éventuellement être libéré. Dans .NET (C #), le Garbage Collector (GC) se chargera du processus de libérer de la mémoire pour vous. Il suit l'utilisation de vos objets, et après qu'ils deviennent « sans racines ». (Ex: il n'y a pas de références dans votre application à cet objet, directement ou indirectement), est nettoyé automatiquement la mémoire de l'objet vers le haut

Jeter, ou plus particulièrement, IDisposable et le modèle Dispose, est utilisé pour gérer les ressources séparément du GC. Certaines ressources doivent être nettoyé explicitement , pour diverses raisons. Cela inclut l'utilisation d'une API « native » (où .NET ne connaît pas la mémoire allouée), en utilisant une ressource qui enveloppe les poignées d'origine, etc. Afin de gérer cette proprement, vous implémentez IDisposable et le modèle Dispose.

se produit sur des objets Finalisation quand ils sont sur le point d'être collectés par le collecteur des ordures. Cela donne un « filet de sécurité », où par un objet qui aurait été disposé peut encore être nettoyé, si un peu plus tard idéal. En mettant en œuvre un finaliseur, vous pouvez garantir des ressources non gérés sont toujours libérés.

Le problème avec la plupart des échantillons est qu'il ya plusieurs raisons d'utiliser IDisposable, et la mise en œuvre diffère en fonction de la raison pour laquelle vous l'utilisez. Par exemple, si vous enveloppez une ressource native directement, vous devez implémenter un finaliseur, mais si vous encapsulez un autre type IDisposable, un finaliseur est pas nécessaire, même si vous devez mettre en œuvre encore IDisposable. Pour résoudre ce problème, je l'ai écrit sur IDisposable et mise au point en profondeur sur mon blog , décrivant la plusieurs raisons pour lesquelles vous utiliseraient IDisposable et différents modèles pour différentes raisons.

Vous pouvez juste vouloir lire ce que je considère l'article définitif sur IDisposable, finaliseurs et la collecte des ordures, Shawn Farkas' CLR Inside Out. Fouiller IDisposable

Cet article laisse très peu de doute sur le sujet.

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