Un destructor es un métodoo especial de una clase que se ejecuta de manera automática antes de que esa clase sea eliminada físicamente de la memoria. ¿Cuándo ocurre esto? El compilador se encarga de establecer cuándo los objetos de las clases dejan de tener validez a lo largo de la ejecución de un programa y cúando deben ser destruidos para no ocupar espacio innecesario en la memoria.
Un destructor se distingue fácilmente porque, al igual que el constructor, tiene el mismo nombre que la clase a la que pertenece precedido por el carácter '~'. Los destructores no se heredan ni pueden ser sobrecargados, no se pueden invocar explícitamente, no permiten modificadores de accesoy no tienen parámetros.
Cuando no especifiques un destructor de una clase, el compilador proporciona uno de manera no visible con una mínima síntaxis. Por ejemplo, el destructor de nuestra clase 'Account' de la sección anterior sería expresado así:
El destructor llama implícitamente al método 'Finalize' del Framework, lo que se traduce en el siguiente código:
No te preocupes si de momento no entiendes bien algunas de las palabras clave de este código. Lo importante ahora es que te quedes con la idea de la función del destructor. En el cuerpo del destructor puede incluirse el código fuente necesario para la destrucción de objetos que encapsulan recursos no administrados por el recolector de basura del compilador, como por ejemplo un flujo para acceso a archivos, una conexión de red, etc.; es en estos casos cuando es recomendable hacer uso de los destructores. Pero en la mayoría de los casos no deberás preocuparte de ello, pues será el recolector de basura el que se encargue de manera automática en la destrucción de objetos innecesarios y la consiguiente liberación de espacio de memoria.
Resumiendo: un destructor es invocado automáticamente justo antes de que el objeto sea recolectado por el recolector de basura de .NET Framework, y esto ocurre cuando no quedan referencias al objeto.
El recolector de basura se halla en ejecución en todo momento paralelamente a la ejecución de nuestro programa. Pero podemos acceder a sus métodos a través de la clase 'GC' del espacio de nombres 'System'. Por ejemplo, el método 'Collect' de esta clase obliga a que se lleve a cabo la recolección de elementos no utilizados. Sin embargo, esto rara vez será utilizado, en todo caso en una aplicación que, debido a su enorme complejidad, tenga un elevadísimo consumo de memoria.