2009-11-07 5 views
54

Ich dachte, der GC würde Dispose schließlich aufrufen, wenn Ihr Programm nicht hätte, dass Sie Dispose() in Ihrem Programm aufrufen sollten, nur um die Bereinigung deterministisch zu machen.Ruft Garbage Collector Dispose() auf?

jedoch von meinem kleinen Testprogramm, kann ich überhaupt nicht genannt sehen Dispose bekommen ....

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"); 
    } 
} 

// Ausgabe ist nur „Constructor“, versteht mich nicht „Entsorgen“ wie ich es erwarten würde. Was geht?

EDIT: Ja, ich weiß, ich sollte Dispose() aufrufen - ich verfolge das Standardmuster bei der Verwendung von Einwegobjekten. Meine Frage ergibt sich, weil ich versuche, ein Leck in jemandes Code zu finden, der C++ verwaltet (eine andere Ebene der Komplexität, die das gute Thema eines anderen Threads wäre).

+0

Diese Frage ist ein Duplikat von [http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for finden -me] (http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-idisposable-dispose-for-me). –

Antwort

50

Der GC ruft nicht Dispose, es ruft Ihren Finalizer (die Sie anrufen sollten Dispose(false)).

Bitte schauen Sie sich die verwandten Beiträge auf der Seite oder die C für das Entsorgen Muster # Best Practices nachschlagen (Die docs on IDisposable es erklären recht gut IIRC.)

+4

Der Name ist "finializer", es ist vielleicht bedauerlich, dass C# ähnliche Syntax wie ein C++ - Destruktor verwendet. –

+1

Richtig, meine Sprachen hier zu verwirren. – Eloff

+4

Es ist zu beachten, dass der Standard * Finalizer * nichts tut. Siehe auch: http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight