Destruidores (Guia de Programação em C#)

Destruidores são usadas para instâncias de classes de destruct.

Comentários

  • Destruidores não podem ser definidas em estruturas. Eles são usados somente com classes.

  • Uma classe só pode ter um destruidor.

  • Destruidores não podem ser herdadas ou sobrecarregados.

  • Destruidores não podem ser chamados. Eles são invocados automaticamente.

  • Um destruidor não leva modificadores nem tem parâmetros.

Por exemplo, a seguir está uma declaração de um destruidor da classe Car:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

O destruidor implicitamente chama Finalize na classe base do objeto. Portanto, o código anterior do destruidor implicitamente é convertido para o código a seguir:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

Isso significa que o Finalize método é chamado recursivamente para todas as instâncias da cadeia de herança, da maioria derivada para derivado de menos.

Dica

Destruidores vazios não devem ser usados.Quando uma classe contém um destruidor, uma entrada é criada na Finalize fila.Quando o destruidor é chamado, o coletor de lixo é chamado para processar a fila.Se o destruidor estiver vazio, isso apenas causa uma perda desnecessária de desempenho.

O programador não tem controle sobre quando o destruidor é chamado porque isso é determinado pelo coletor de lixo. O coletor de lixo procura objetos que não estão sendo usados pelo aplicativo. Se um objeto considera elegível para destruição, ele chama o destruidor (se houver) e recupera a memória usada para armazenar o objeto. Destruidores também são chamados quando o programa é encerrado.

É possível forçar a coleta de lixo chamando Collect, mas na maioria das vezes, isso deve ser evitado porque pode criar problemas de desempenho.

Usar destruidores para recursos de lançamento

Em geral, o C# não requer tanto gerenciamento de memória como é necessário quando você desenvolve com uma linguagem que não tem um tempo de execução com coleta de lixo. Isso ocorre porque o.NET Framework coletor de lixo implicitamente gerencia a alocação e liberação de memória para os objetos. No entanto, quando seu aplicativo encapsula recursos não gerenciados, como o windows, arquivos e conexões de rede, você deve usar destruidores para liberar esses recursos. Quando o objeto é qualificado para destruição, o coletor de lixo executa o Finalize método do objeto.

Versão explícita de recursos

Se seu aplicativo estiver usando um recurso externo caro, também é recomendável que você fornecer uma maneira para liberar explicitamente o recurso antes que o coletor de lixo libera o objeto. Faz isso implementando uma Dispose método a partir do IDisposable interface que executa a limpeza necessária para o objeto. Isso pode aumentar consideravelmente o desempenho do aplicativo. Mesmo com esse controle explícito sobre recursos, o destruidor se torna uma salvaguarda para limpar recursos, se a chamada para o Dispose falha no método.

Para obter mais detalhes sobre a limpeza de recursos, consulte os tópicos a seguir:

Exemplo

O exemplo a seguir cria três classes que compõem uma cadeia de herança. A classe First é a classe base, Second é derivada de First, e Third é derivada de Second. Todas três tem destruidores. Na Main(), uma instância da classe derivada para a maioria é criada. Quando o programa é executado, observe que os destruidores para as três classes são chamados automaticamente e em ordem, da maioria derivada para derivado de menos.

class First
{
    ~First()
    {
        System.Diagnostics.Trace.WriteLine("First's destructor is called.");
    }
}

class Second : First
{
    ~Second()
    {
        System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
    }
}

class Third : Second
{
    ~Third()
    {
        System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
    }
}

class TestDestructors
{
    static void Main()
    {
        Third t = new Third();
    }

}
/* Output (to VS Output Window):
    Third's destructor is called.
    Second's destructor is called.
    First's destructor is called.
*/

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Construtores (Guia de Programação em C#)

IDisposable

Conceitos

Guia de Programação em C#

Outros recursos

Coleta de Lixo