2010-09-05 18 views
13

Possible en double:
Finalize vs DisposeQuelle est la différence entre finaliser et disposer dans .net?

Salut,

Récemment, j'interrogé dans une interview au sujet Finaliser et éliminer. Quand est-ce que chacun d'entre eux est utilisé et comment Garbage Collector est lié à eux. Veuillez partager des liens pour éclairer davantage sur le sujet.

Veuillez partager ...

Merci d'avance.

+0

Vous n'avez pas reçu l'offre d'emploi alors? Il est couvert dans n'importe quel livre sur C# ou le CLR. –

+0

J'ai répondu à la question, mais qu'est-ce qui m'a intrigué quand l'interviewer a demandé ce qui se passait lorsque nous impliquons explicitement Dispose, quel est le rôle du GC et où se situe la Finalize? – HotTester

Répondre

17

Les finaliseurs sont exécutés par Garbage Collection avant qu'un objet eligible for collection ne soit récupéré. Dispose() est conçu pour nettoyer les ressources non managées, telles que les connexions réseau, les fichiers, les poignées vers les éléments du système d'exploitation, & c. Cela fonctionne mieux en conjonction avec le bloc using où le compilateur s'assure que Dispose() sera appelé immédiatement une fois que vous avez terminé avec un objet - et garantit également que vous ne pouvez plus travailler avec l'objet une fois qu'il est éliminé.

Notez que finalizers don't have to run, donc compter sur cela peut être dangereux:

Qu'est-ce que cela signifie pour vous: Vos programmes ne peuvent pas compter sur finalizers tenir l'ordre. Les finaliseurs sont un filet de sécurité et non un moyen principal de récupération des ressources. Lorsque vous avez terminé avec une ressource, vous devez le libérer en appelant Close ou Disconnect ou la méthode de nettoyage disponible sur l'objet. (L'interface IDisposable codifie cette convention.)

Attention également à l'heure exacte à laquelle un objet devient admissible à la collecte. Lire l'article ci-dessus - ce n'est ni une portée (un mot bizarre qui n'a rien à voir avec la durée de vie d'un objet - c'est “the region of program text in which it is legal to refer to [a named entity] by its unqualified name.”) ni une référence stricte car un objet peut devenir admissible avant même que la dernière référence un moyen.

+1

Je voudrais ajouter que les finaliseurs doivent être utilisés avec précaution. Lorsque vous ajoutez un finaliseur à vos objets, le runtime reste sur l'objet pendant au moins deux cycles GC. En outre, à l'intérieur du finaliseur, vous n'êtes pas garanti qu'aucun membre de votre objet n'a été récupéré. Donc, y accéder peut entraîner des exceptions d'exécution. – taylorjonl

15
  1. Finaliser: indéterministe nondéterministe destructor/finalizer appelé automatiquement par le Garbage Collector quand il n'y a plus de références à cette instance.
  2. Dispose: appelé de façon déterministe par le développeur sur un objet implémentant IDisposable pour libérer des ressources.
+1

Je pense que "non déterministe" est le bon mot ici. –

+0

@Steven, mon anglais est très pauvre. Merci de l'avoir signalé. –

+0

Donc, si le développeur implémente IDisposable, Finalize sera-t-il encore appelé par le GC? – HotTester