2009-11-07 5 views
54

Je pensais que le GC appellerait Dispose éventuellement si votre programme ne le faisait pas mais que vous devriez appeler Dispose() dans votre programme juste pour rendre le nettoyage déterministe.Le garbage collector appelle-t-il Dispose()?

Cependant, de mon petit programme de test, je ne vois pas se disposer appelé du tout ....

public class Test : IDisposable 
{ 
    static void Main(string[] args) 
    { 
     Test s = new Test(); 
     s = null; 
     GC.Collect(); 
     Console.ReadLine(); 
    } 

    public Test() 
    { 
     Console.WriteLine("Constructor"); 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

// La sortie est juste « Constructor », je ne suis pas « Jeter » comme je m'attendrais. Quoi de neuf? Oui, je sais que je devrais appeler Dispose() - Je suis le modèle standard lorsque j'utilise des objets jetables. Ma question se pose car j'essaie de traquer une fuite dans le code de quelqu'un d'autre, qui est géré en C++ (une autre couche de complexité qui serait le bon sujet d'un autre thread).

+0

Cette question est un doublon de [http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for -me] (http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for-me). –

Répondre

50

Le GC n'appelle pas Dispose, il appelle votre finaliseur (que vous devez appeler Dispose(false)).

S'il vous plaît regarder les commentaires sur le côté ou rechercher les meilleures pratiques C# pour le motif Dispose (Le docs on IDisposable explique assez bien IIRC.)

+4

Le nom est "finializer", il est peut-être regrettable que C# utilise une syntaxe similaire à celle d'un destructeur C++. –

+1

A droite, mes langues sont confuses ici. – Eloff

+4

Il est à noter que le * Finalizer * par défaut ne fait rien. Voir aussi: http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight

Questions connexes