Para que servem Destrutores?
Destrutores são usados para destruir instâncias de classes. Na prática eles têm a função inversa à função dos Construtores. Construtores nos dão a chance de criar regras para a criação de instâncias de Classes, e Destrutores ditam as regras para a destruição dessas instâncias. Em C # você nunca pode chamá-los explicitamente, a razão é que não se pode destruir um objeto. Então, quem tem o controle sobre um destrutor? É o. NET Garbage Collector (GC - maiores informações http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx).

Sintaxe de um Destrutor




 public class ExemploDestrutor

        {

            //Destrutor

            // ~ + o nome da Classe

            ~ExemploDestrutor()

            {

                //Codigo de destruição de objetos

            }

        }

Como podemos ver o Destrutor é identificado pelo símbolo ~ seguido do nome da classe.

Algumas características de um Destrutor



Não podem ser definidos em Structs
Só podem ser definidos em Classes
Não podem ser herdados ou sobrecarregados
Não possuem modificadores de acesso (public, private, protected etc.) nem possuem parâmetros
Não podem ser chamados, pois são invocados automaticamente
Uma instância pode ser destruída quando nenhum outro recurso utiliza essa instância
O programador não possui controle de quando o Destrutor será chamado, pois isso é determinado pelo Garbage Collector
Destrutores podem ser chamados quando uma aplicação termina seu processamento

Para exemplificar o comportamento do Garbage Collector e o uso de Destrutores vamos criar uma aplicação do tipo Console no Visual Studio e criar três classes da seguinte maneira:


class Primeiro

        {

            ~Primeiro()

            {

                Debug.Write("Primeiro destrutor chamado pelo GC");

                Debug.WriteLine("==");

                Debug.WriteLine(" ");

                Debug.WriteLine(" ");

            }

        }

        class Segundo : Primeiro

        {

            ~Segundo()

            {

                Debug.Write("Segundo destrutor chamado pelo GC");

                Debug.WriteLine("==");

            }

        }

        class Terceiro : Segundo

        {

            ~Terceiro()

            {

                Debug.WriteLine(" ");

                Debug.WriteLine(" ");

                Debug.Write("Terceiro destrutor chamado pelo GC");

                Debug.WriteLine("==");

            }

        }

Note o leitor que criamos as três classes fazendo com que a classe “Terceiro” herde da “Segundo”, e esta herde da “Primeiro”. Em cada classe definimos um Destrutor que ira escrever algo na janela “Output” do Visual Studio, para podermos ver a ordem de execução de cada Destrutor.

Na classe program, no método main, adicione o seguinte código:


  static void Main(string[] args)

        {

            Terceiro T = new Terceiro();

        }

Instanciamos um objeto do tipo Terceiro, e não fazemos mais nada com esse objeto. Como o leitor pode ver nossa aplicação não fará absolutamente nada, mas precisaremos rodá-la para ver o resultado das chamadas dos destrutores na janela Output do Visual Studio. Lembrando que para visualizar essa janela basta acessar no Visual Studio o menu superior “View” – “Output” ou digitar no teclado o atalho “ctrl + w+o”. O resultado segue na imagem a seguir:



Como podemos ver o GC realiza a destruição dos objetos alocados em memória como se fosse uma cascata. Primeiro foi o objeto instanciado (Terceiro) depois seguiu a ordem de herança deste objeto (Segundo – Primeiro)

Alguns pontos uteis sobre Construtores

A) Quando nossas classes trabalham com Arquivos, Conexões e Recursos de Sistemas Operacionais, devemos sempre que possível utilizar Destrutores, para limpar a memória que esses objetos utilizam.

B) Não utilizar Destrutores vazios. Pois quando uma classe contem um Destrutor ela entra na fila de Finalização do GC. Se este Destrutor estiver vazio, a classe irá estar nesta fila inutilmente, o que gera alocação de memória desnecessária.

Vamos terminamos por aqui. Um grande abraço a todos e até a próxima.