2009-11-07 18 views
54

Ho pensato che il GC avrebbe chiamato Dispose alla fine se il tuo programma non l'avesse fatto, ma che dovresti chiamare Dispose() nel tuo programma solo per rendere deterministico il cleanup.Il garbage collector chiama Dispose()?

Tuttavia, dal mio piccolo programma di test, non vedo smaltire sempre chiamato a tutti ....

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

// uscita è solo "Costruttore", non ottengo "Smaltimento" come mi aspetterei. Che cosa succede?

MODIFICA: Sì, so che dovrei chiamare Dispose() - Seguo lo schema standard quando utilizzo gli oggetti usa e getta. La mia domanda sorge perché sto cercando di rintracciare una perdita nel codice di qualcun altro, che è gestito in C++ (un altro livello di complessità che sarebbe il buon argomento di un altro thread).

+0

Questa domanda è una copia di [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). –

risposta

50

Il GC non chiama Dispose, chiama il finalizzatore (che è necessario chiamare Dispose(false)).

Si prega di guardare i relativi messaggi su lato o cercare le migliori pratiche C# per il pattern Dispose (Il docs on IDisposable spiegano abbastanza bene IIRC.)

+4

Il nome è "finializer", è forse un peccato che C# usi una sintassi simile a un distruttore C++. –

+1

Giusto, confondendo qui le mie lingue. – Eloff

+4

Si noti che il predefinito * Finalizer * non fa nulla. Vedi anche: http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight