Compartilhar via


Destructors (C# Programming Guide)

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

Comentários

  • Destruidores não podem ser definidos 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 de 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.

ObservaçãoObservação

Destruidores vazios não devem ser usados. Quando uma classe contém um destruidor, uma entrada é criada no 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 verifica para 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 sai do programa.

É possível forçar a coleta de lixo chamando Collect, mas a 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 os recursos não gerenciados, como 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 o 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. Você faz isso implementando um 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 seguintes tópicos:

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. Em 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 C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Constructors (C# Programming Guide)

IDisposable

Conceitos

C# Programming Guide

Coleta de Lixo