~ es el destructor
- Los destructores se invocan automáticamente y no se pueden invocar de forma explícita.
- Los destructores no se pueden sobrecargar. Por lo tanto, una clase puede tener, como máximo, un destructor.
- Destructores no heredados. Por lo tanto, una clase no tiene destructores más que el que puede declararse en él.
- Destructors no se pueden utilizar con structs. Solo se usan con clases. Una instancia se convierte en elegible para destrucción cuando ya no es posible que un código use la instancia.
- La ejecución del destructor para la instancia puede ocurrir en cualquier momento después de que la instancia sea elegible para la destrucción.
- Cuando se destruye una instancia, los destructores en su cadena de herencia se llaman, en orden, de la mayoría derivada a la menos derivada.
Finalizar
En C#, el método Finalizar realiza las operaciones que un estándar C++ destructor haría. En C#, no lo nombra Finalizar: utiliza la sintaxis del destructor de C++ para colocar un símbolo de tilde (~) antes del nombre de la clase.
Desechar
Es preferible disponer de objetos en un método Close()
o Dispose()
que se puede llamar explícitamente por el usuario de la clase. Finalize (destructor) son llamados por el GC.
La interfaz de IDisposable le dice al mundo que su clase conserva los recursos que deben eliminarse y ofrece a los usuarios una forma de liberarlos. Si necesita implementar un finalizador en su clase, su método de eliminación debe usar el método GC.SuppressFinalize()
para asegurarse de que la finalización de su instancia esté suprimida.
¿Qué utilizar?
No es legal llamar a un destructor explícitamente. Su destructor será llamado por el recolector de basura. Si maneja valiosos recursos no administrados (como manejadores de archivos) que desea cerrar y eliminar lo más rápido posible, debe implementar la interfaz IDisposable.
No sé cómo solía ser en el pasado. Pero ahora los destructores son heredados. Consulte este enlace para obtener más información (consulte el ejemplo al final): http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx – RononDex
@RononDex, punto 3 de la misma página que enlaza con los estados * "Finalizadores no se puede heredar "*, lo que contradice su comentario. Es cierto que todo es un poco confuso porque, aunque no se pueden heredar, * "el método' Finalize' se llama recursivamente para todas las instancias en la cadena de herencia, desde el más derivado al menos derivado "*. Sin embargo, tenga en cuenta que * * no * es el mismo comportamiento que obtendría de los destructores heredables. –
@MarkAmery ah veo, ¿así que, básicamente, se les llama en el orden inverso en comparación con algo que se hereda? – RononDex