Pregunta

Estoy mirando algún código y tiene esta declaración:

~ConnectionManager()
{
    Dispose(false);
}

La clase implementa la interfaz IDisposable , pero no sé si eso es parte de eso para lo que se usa la tilde (~).

¿Fue útil?

Solución

~ es el destructor

  1. Los destructores se invocan automáticamente y no se pueden invocar explícitamente.
  2. Los destructores no se pueden sobrecargar. Por lo tanto, una clase puede tener, como máximo, un destructor.
  3. Los destructores no se heredan. Por lo tanto, una clase no tiene destructores distintos al que se puede declarar en ella.
  4. Los destructores no pueden usarse con estructuras. Solo se usan con clases. Una instancia se vuelve elegible para la destrucción cuando ya no es posible que ningún código use la instancia.
  5. 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.
  6. Cuando se destruye una instancia, los destructores en su cadena de herencia se llaman, en orden, de más derivados a menos derivados.

Finalizar

En C #, el método Finalize realiza las operaciones que haría un destructor C ++ estándar. 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.

Disponer

Es preferible disponer de objetos en un método Close () o Dispose () que el usuario de la clase puede llamar explícitamente. Finalize (destructor) son llamados por el GC.

La interfaz IDisposable le dice al mundo que su clase tiene recursos que necesitan ser eliminados y proporciona a los usuarios una forma de liberarlos. Si necesita implementar un finalizador en su clase, su método Dispose debería usar el método GC.SuppressFinalize () para garantizar que se suprima la finalización de su instancia.

¿Qué usar?

No es legal llamar a un destructor explícitamente. Su recolector será llamado por el recolector de basura. Si maneja valiosos recursos no administrados (como los manejadores de archivos) que desea cerrar y desechar lo más rápido posible, debe implementar la interfaz IDisposable.

Otros consejos

Este es un finalizador . Para ser honesto, rara vez debería necesitar escribir un finalizador. Realmente solo necesita escribir uno si:

  • Tiene acceso directo a un recurso no administrado (por ejemplo, a través de un IntPtr ) y no puede usar SafeHandle que lo hace más fácil
  • Está implementando IDisposable en una clase que no está sellada. (Prefiero sellar clases a menos que estén diseñadas para la herencia). Un finalizador es parte del patrón de eliminación canónico en tales casos.

Se utiliza para indicar el destructor de la clase.

Igual que C ++, es el destructor; sin embargo, en C # no lo llama explícitamente, se invoca cuando se recolecta el objeto.

Consulte Destructores (Guía de programación de C #) . Sin embargo, tenga en cuenta que, a diferencia de C ++, el programador no tiene control sobre cuándo se llama al destructor porque esto lo determina el recolector de basura.

~ generalmente representa un deconstructor. que se ejecuta justo antes de que muera un objeto.

Aquí hay una descripción de los deconstructores de C # que encontré

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top