Por ejemplo:
public class Person
{
public Person()
{
}
~Person()
{
}
}
¿Cuándo debo crear manualmente un destructor? ¿Cuándo has necesitado crear un destructor?
Por ejemplo:
public class Person
{
public Person()
{
}
~Person()
{
}
}
¿Cuándo debo crear manualmente un destructor? ¿Cuándo has necesitado crear un destructor?
Respuestas:
ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog en mayo de 2015 . Gracias por la gran pregunta! Consulte el blog para obtener una larga lista de falsedades que la gente comúnmente cree acerca de la finalización.
¿Cuándo debo crear manualmente un destructor?
Casi nunca.
Por lo general, uno solo crea un destructor cuando su clase retiene algún recurso costoso no administrado que debe limpiarse cuando el objeto desaparece. Es mejor usar el patrón desechable para garantizar que el recurso se limpie. Un destructor es esencialmente una garantía de que si el consumidor de su objeto olvida deshacerse de él, el recurso aún se limpia eventualmente. (Tal vez.)
Si crea un destructor, tenga mucho cuidado y comprenda cómo funciona el recolector de basura . Los destructores son realmente raros :
Casi nada de lo que es normalmente cierto es cierto en un destructor. Ten mucho, mucho cuidado. Escribir un destructor correcto es muy difícil.
¿Cuándo has necesitado crear un destructor?
Al probar la parte del compilador que maneja los destructores. Nunca he necesitado hacerlo en el código de producción. Raramente escribo objetos que manipulen recursos no administrados.
Se llama "finalizador", y normalmente solo debe crear uno para una clase cuyo estado (es decir, campos) incluya recursos no administrados (es decir, punteros a los manejadores recuperados mediante llamadas p / invoke). Sin embargo, en .NET 2.0 y versiones posteriores, en realidad hay una mejor manera de lidiar con la limpieza de los recursos no administrados: SafeHandle . Teniendo esto en cuenta, prácticamente nunca debería necesitar escribir un finalizador nuevamente.
No necesita uno a menos que su clase mantenga recursos no administrados como los identificadores de archivos de Windows.
Se llama destructor / finalizador, y generalmente se crea al implementar el patrón Disposed.
Es una solución alternativa cuando el usuario de su clase olvida llamar a Dispose, para asegurarse de que (eventualmente) se liberen sus recursos, pero no tiene ninguna garantía de cuándo se llama al destructor.
En esta pregunta de desbordamiento de pila , la respuesta aceptada muestra correctamente cómo implementar el patrón de disposición. Esto solo es necesario si su clase contiene recursos no controlados que el recolector de basura no logra limpiar por sí mismo.
Una buena práctica es no implementar un finalizador sin darle también al usuario de la clase la posibilidad de desechar manualmente el objeto para liberar los recursos de inmediato.
Cuando tenga recursos no administrados y necesite asegurarse de que se limpiarán cuando su objeto desaparezca. Un buen ejemplo sería objetos COM o controladores de archivos.
He usado un destructor (solo para fines de depuración) para ver si un objeto se estaba purgando de la memoria en el ámbito de una aplicación WPF. No estaba seguro de si la recolección de basura realmente estaba purgando el objeto de la memoria, y esta era una buena manera de verificar.
Los destructores proporcionan una forma implícita de liberar recursos no administrados encapsulados en su clase, se les llama cuando el GC se acerca a ellos y se llama implícitamente al método Finalizar de la clase base. Si está utilizando muchos recursos no administrados, es mejor proporcionar una forma explícita de liberar esos recursos a través de la interfaz IDisposable. Consulte la guía de programación de C #: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx