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
}
}
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("==");
}
}
Na classe program, no método main, adicione o seguinte código:
static void Main(string[] args)
{
Terceiro T = new Terceiro();
}
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.