2009-11-07 10 views
54

Pensé que el GC llamaría a Dispose eventualmente si su programa no lo hizo pero que debe llamar a Dispose() en su programa solo para hacer la limpieza determinista.¿El recolector de basura llama a Dispose()?

Sin embargo, desde mi programa de pruebas poco, no veo Deseche recibiendo llamadas en absoluto ....

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 salida es simplemente "Constructor", no lo entiendo "Desechar" como yo esperaría ¿Que pasa?

EDIT: Sí, sé que debo llamar a Dispose(): sigo el patrón estándar cuando uso objetos desechables. Mi pregunta surge porque estoy tratando de rastrear una fuga en el código de alguien más, que es C++ administrado (otra capa de complejidad que sería el buen tema de otro hilo).

+0

Esta pregunta es un duplicado de [http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-disponible-disponer-para -me] (http://stackoverflow.com/questions/45036/will-the-garbage-collector-call-disposable-dispose-for-me). –

Respuesta

50

El GC no llama al Dispose, llama al finalizador (que debe llamar al Dispose(false)).

Por favor mira los puestos relacionados en el lado o buscar las mejores prácticas de C# para el patrón Dispose (El docs on IDisposable lo explican bastante bien IIRC.)

+4

El nombre es "finializer", es quizás desafortunado que C# use una sintaxis similar como un destructor de C++. –

+1

Bien, confundir mis idiomas aquí. – Eloff

+4

Se debe tener en cuenta que el * Finalizer * predeterminado no hace nada. Ver también: http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867 – Wernight

Cuestiones relacionadas