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.
Vous n'avez pas reçu l'offre d'emploi alors? Il est couvert dans n'importe quel livre sur C# ou le CLR. –
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