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
Everybody thinks about garbage collection the wrong way:
Un programa escrito correctamente, no se puede asumir que finalizadores alguna vez correr.
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.
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 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 –
También sería útil leer sobre la forma correcta de implementar el patrón IDisposable. Hay mucho más que lo que pensamos -
Enlace roto, ¿podría actualizar? – DSF
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.
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.
- 1. Destructor en Objective-C++
- 2. Uso de "esto" en el destructor
- 3. referencia y destructor en C++
- 4. C++ comportamiento destructor
- 5. Uso del: operador en C
- 6. Uso del rendimiento en C#
- 7. C++ error relacionado con la definición del constructor/destructor
- 8. Cómo llamar al destructor en C# XNA
- 9. derecho de uso de std :: uncaught_exception en un destructor
- 10. ¿Cuándo se llama un destructor de C++?
- 11. C++ y destructor llamada de función para
- 12. EventHandlers y C# Classes destructor/Dispose
- 13. destructor estática
- 14. destructor estático
- 15. C# Destructor no funciona como se esperaba
- 16. Destructor crash
- 17. Uso del cifrado AES en C#
- 18. Uso del^operador en visual C++
- 19. C++ destructor: cuando la memoria se libera?
- 20. Uso de plantillas en C++
- 21. Valor devuelto Optimización - C++ - Destructor llama
- 22. Uso del ensamblaje en línea en C/C++
- 23. Qt C++ destructor tarda mucho tiempo en regresar
- 24. Nombre del patrón para crear en el constructor, eliminar en el destructor (C++)
- 25. ¿Hay algún uso para hacer un destructor protegido virtual?
- 26. Uso de GMock para verificar una llamada de destructor
- 27. Destructor en const char *
- 28. Excepción en destructor
- 29. Orden del miembro constructor y llamadas al destructor
- 30. Smart pointers & destructor
+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
Grandes palabras. Se ha agregado el artículo a marcadores – zerkms
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 *. –