none
Dispoe, Finalize, Destructeur, Close ... c'est quoi la difference ? RRS feed

  • Question

  • Bonjour,

    Je suis entrain de me renseigner sur le fonctionnement du garbage collector en .Net ainsi que la gestion de memoire et la liberation des ressources non managées encapsulées dans des objets managés.

    Mais j'arrive pas du tout à comprendre la différence entre Dispose , Finalize, Close, et le destructeur ... tous semblent être des mécanismes similaires pour gérer des ressources non managées mais je comprend pas quand est ce qu'il faut utiliser l'un ou l'autre !!!

    Sur msdn ou dans des doc ca semble tres confusn, des fois le destructeur et Finalize sobt assimilés à une meme chose, pareil pour close et dispose ...

    Est ce que quelqu'un pourrait m'expliquer tout celà svp ?

    merci bcp pour votre aide !

    Bon WK

    dimanche 21 octobre 2012 11:48

Réponses

  • Bonjour,

    En première approche je dirais :

    - la méthode Dispose est destinée à être appelée (explicitement ou via une instruction "using") par un développeur pour signaler explicitement sa volonté de "nettoyer" les ressources non managées d'un objet
    - une méthode Close est parfois ajoutée (qui généralement fait à 99% ou 100% la même chose que Dispose) pour des raisons de sens (il est plus naturel de faire un "Close" qu'un "Dispose" sur un fichier)
    - Finalize est destinée à être appelée par le Framework (on peut voir cela comme un filet de sécurité pour Dispose, dans Dispose on signale d'ailleurs généralement au .NET Framework qu'il devient inutile d'appeler Finalize). Finalize est défini en C# en utilisant la syntaxe d'un destructeur (cf http://msdn.microsoft.com/fr-fr/library/vstudio/66x5fx1b.aspx qui montre le code généré par cette syntaxe : appel du code indiqué plus appel à la méthode Finalize de la classe de base).

    La doc semble effectivement peu claire. Une référence reconnue semble être http://www.bluebytesoftware.com/blog/PermaLink,guid,88e62cdf-5919-4ac7-bc33-20c06ae539ae.aspx mais en anglais.

    Je pense que le mieux serait de commencer par Dispose (l'idée étant que le développeur doit appeler Dispose), plus exceptionnellement de gérer Finalize (si un oubli pourrait être réellement problématique, sinon si Dispose est bien appelé, Finalize est normalement inutile) et gérer un Finalize sans Dispose n'a probablement aucun sens.

    Essayez de relire la doc en gardant à l'esprit les qq indications ci-dessus. Au delà, il faudrait sans doute moi-même que je me penche de plus près sur le sujet mais globalement les indications ci-dessus doivent donner au moins l'objectif correct de Dispose/Close/Finalize.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    dimanche 21 octobre 2012 13:09
    Modérateur

Toutes les réponses