Partilhar via


Destructors (guia de programação C#)

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

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 levar modificadores ou ter parâmetros.

Por exemplo, a seguir é 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 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-derivados para os derivados de menos.

Observaçã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 provoca 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 qualificados 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 for encerrado.

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

Usando Destructors para recursos de versão

Em geral, translation from VPE for Csharp não exige tanta gerenciamento de memória necessário quando você desenvolve com um linguagem que não visa um tempo de execução com coleta de lixo.Isso ocorre porque o coletor de lixo do .NET estrutura implicitamente gerencia a alocação e a versão de memória para os objetos.No entanto, quando seu aplicativo encapsula recursos não gerenciados, sistema autônomo janelas, 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 é executado o Finalize método do objeto.

Versão explícita de recursos

Se seu aplicativo estiver usando um recurso externo caro, também recomendamos que você fornecer uma maneira para liberar explicitamente o recurso antes que o coletor de lixo libera o objeto.Para fazer isso, Implementando um Dispose método a partir do IDisposable interface que executa a limpeza necessária para o objeto. Isso pode melhorar consideravelmente o desempenho do aplicativo.Mesmo com esse controle explícito sobre recursos, o destruidor se torna uma medida de proteção para limpar recursos, se a telefonar para o Dispose Falha do método.

Para obter mais detalhes sobre 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 é derivado de First, e Third é derivado de Second. Todos os três tem destruidores.In Main(), uma instância da classe derivada da maioria é criada. Quando o programa for executado, observe que os destruidores para as três classes são chamados automaticamente e em ordem, da maioria-derivados para os derivados 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 as seções a seguir no Especificação da linguagem C#:

  • 1.6.7.6 Destruidores

  • 10.3.9.4 Nomes de membro reservados para destruidores

  • 10.13 Destruidores (classes)

  • 11.3.9 Destruidores (Structs)

Consulte também

Conceitos

Guia de Programação C#

Referência

Construtores (Guia de programação do C#)

IDisposable

Outros recursos

Coleta de Lixo