2010-09-06 29 views
7

Estoy un poco confundido acerca del uso del destructor en C#. En mi conocimiento, no podemos llamar al destructor de acuerdo con mi deseo de que llame automáticamente antes del recolector de basura para realizar algún trabajo sobre la clase (objeto), así que quiero preguntar si estamos usando destructor en C# entonces cuando necesitamos recolector de basura. Como sé que destructor puede encargarse de la memoria, ¿por qué necesitamos el recolector de basura?Uso del destructor en C#?

Respuesta

14

Everybody thinks about garbage collection the wrong way:

Un programa escrito correctamente, no se puede asumir que finalizadores alguna vez correr.

+0

+1 Más o menos la mejor respuesta hasta el momento, y la única que es realmente correcta. En el mejor de los casos, usted pone una llamada a Dipose() en su finalizador, en caso de que Dispose() no haya sido llamado manualmente por otro código en su programa. – siride

+0

Grandes palabras. Se ha agregado el artículo a marcadores – zerkms

+1

También el artículo vinculado por Unmesh es un recurso muy bueno, http://msdn.microsoft.com/en-us/magazine/cc163392.aspx.Hay muchos otros artículos en la web que mencionan el patrón 'Dispose (bool disposing)' sin explicar en realidad la diferencia entre los recursos 'nativos' y 'administrados'. He visto muchas clases que implementaron innecesariamente el patrón para disponer recursos * administrados *. –

2

El destructor no es para limpiar la memoria administrada. Para eso es el recolector de basura. El destructor es para limpiar otros recursos como identificadores.

Recomiendo que eche un vistazo a CLR via C# para obtener detalles sobre cómo funciona esto.

3

Creo que al leer su almost duplicate topic no comprende bien cómo funciona el recolector de basura. De una manera muy directa y breve, es su propio servicio el que se ejecuta en segundo plano, rastrea y libera memoria para objetos no utilizados y desechados a lo largo de toda la vida útil de su aplicación. Siendo realistas, debe nunca tener que llamar al GC usted mismo, a menos que sea en casos muy raros y específicos.

Los desctructors se utilizan para limpiar y gratuitas recursos no administrados que no pueden ser liberados por el recolector de basura, ven esto MSDN page para más información sobre los destructores.

+1

+1 para hablar en voz alta que el mejor consejo es, probablemente, para mejorar sus conocimientos sobre gestión de memoria, recolección de basura y recursos nativos/disponer en .NET –

1

Creo que la confusión aquí proviene del hecho de que puede deshacerse de los objetos de forma determinista y no determinista (es decir, cuando el GC se dispone a hacerlo).

Para responder a sus preguntas sobre por qué necesitamos un GC, diría, incluso dejando de lado las pérdidas de memoria, que los GC son bastante efectivos, y tener un requerimiento de reclamar inmediatamente la memoria podría reducir el rendimiento total del sistema. Es un argumento similar al debate de uno versus varios hilos.

0

Destructores en C# se deben utilizar muy raramente. Sin embargo, en algunos casos no tienes elección.

Por ejemplo, si tiene una clase singleton para el registro y por razones de rendimiento no puede usar autoflush, se debe considerar el lavado de un búfer durante la finalización del singleton.