2008-10-09 16 views

Respuesta

169

~ es el destructor

  1. Los destructores se invocan automáticamente y no se pueden invocar de forma explícita.
  2. Los destructores no se pueden sobrecargar. Por lo tanto, una clase puede tener, como máximo, un destructor.
  3. Destructores no heredados. Por lo tanto, una clase no tiene destructores más que el que puede declararse en él.
  4. 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.
  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 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.

+1

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

+0

@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. –

+0

@MarkAmery ah veo, ¿así que, básicamente, se les llama en el orden inverso en comparación con algo que se hereda? – RononDex

7

Se utiliza para indicar el destructor de la clase.

+1

En C#, el término correcto es "finalizador", no "destructor". –

+11

Ambos son correctos, dependiendo de la especificación de C# que lea. El MS más reciente (C unificado 3.0) se refiere a ellos como destructores (por ejemplo, la sección 10.13), pero las especificaciones de ECMA se refieren a ellos como finalizadores. –

+0

@ 1800INFORMACIÓN: El * elemento sintáctico * se llama correctamente destructor. Si una clase tiene un destructor, un compilador de C# generará automáticamente un finalizador que incluye un bloque 'try/finally' generalmente inútil que asegura que se llame al método padre' Finalize'. La mayoría de las cosas que son verdaderas de los destructores son ciertas para los finalizadores, y viceversa, pero las palabras significan cosas ligeramente diferentes. – supercat

4

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

40

Esta es una finalizer. Para ser honesto, rara vez necesitas escribir un finalizador. Que realmente sólo necesita escribir uno si:

  • Usted tiene acceso directo a un recurso no administrado (por ejemplo a través de un IntPtr) y no se puede utilizar SafeHandle que hace que sea más fácil
  • Está implementando IDisposable en una clase que no está sellado. (Mi preferencia es sellar las clases a menos que estén diseñadas para la herencia). Un finalizador es parte del patrón de Disposición canónica en tales casos.
3

Ver Destructors (C# Programming Guide). Sin embargo, tenga en cuenta que, a diferencia de C++, el programador no tiene control sobre cuándo se llama al destructor porque esto está determinado por el recolector de basura.

-1

Un punto en el Finalizador anterior, sobre la situación en la que puede necesitar llamarlo. Necesitas que liberen recursos no administrados, que son más comunes de lo que crees, generalmente para bases de datos. SQLConnection es un ejemplo en el que siempre debes llamar a Dispose() cuando hayas terminado con él.

Un artículo: http://www.codeproject.com/KB/cs/idisposable.aspx

Cuestiones relacionadas