Métodos Finalize e destruidores

Para a maioria dos objetos que seu aplicativo cria, você pode confiar no coletor de lixo do .NET Framework para executar implicitamente todas as tarefas de gerenciamento de memória necessárias. No entanto, quando você cria objetos que encapsulam recursos não gerenciados, você deve explicitamente liberar os recursos não gerenciados quando você terminar usando os em seu aplicativo. O tipo mais comum de recurso não gerenciado é um objeto que envolve um recurso do sistema operacional, como um arquivo, uma janela, ou uma conexão de rede. Embora o coletor de lixo pode controlar o tempo de vida de um objeto que encapsula um recurso não gerenciado, ele não tem conhecimento específico sobre como limpar o recurso. Para esses tipos de objetos, o.NET Framework fornece Método de Object.Finalize, que permite que um objeto limpeza seus recursos não gerenciados corretamente quando o coletor de lixo recupera memória usada pelo objeto. Por padrão, o método de Finalize não fará nada. Se você desejar que o coletor de lixo para executar operações de limpeza no seu objeto antes que recupera memória de objeto, você deve substituir o método de Finalize em sua classe.

Dica

Para implementar o método Finalize em C#, você deve usar sintaxe de destrutor.No .NET Framework versão 2,0, Visual C++ fornece sua própria sintaxe para implementar o método Finalize , como descrito em Como: criar uma instância de Classes e estruturas.Na versão do.NET Framework 1,0 e 1,1, Visual C++ usou a sintaxe do destrutor para o método de Finalize , como C# faz.

O coletor de lixo mantém registro dos objetos que possuem métodos de Finalize , usando uma estrutura interna chamada a fila finalização de threads. Cada vez que o aplicativo cria um objeto que tem um método de Finalize , o coletor de lixo coloca uma entrada na fila de acabamento que aponta para o objeto. A fila de acabamento contém entradas para todos os objetos na heap gerenciada que precisam ter seu código de acabamento chamado antes que o coletor de lixo pode recuperar sua memória.

Dica

O exemplo de código fornecido para o método de GC.KeepAlive mostra como coleta de lixo agressiva pode fazer com que um finalizer é executado quando um membro objeto recuperado ainda executar, e como usar o método de KeepAlive para evitar isso.

Um método de Finalize não deve lançar exceções, porque não podem ser tratadas pelo aplicativo e podem causar o aplicativo finalizar.

Implementar métodos ou destruidores de Finalize pode ter um impacto no desempenho negativo e você deve evitar usá-las desnecessariamente. Recuperar memória usada por objetos com métodos de Finalize requer pelo menos duas coleções de lixo. Quando o coletor de lixo executa uma coleta, recupera memória para objetos inacessíveis sem finalizers. No momento, não pode coletar os objetos inacessíveis que têm finalizers. Em vez disso, remover entradas para esses objetos de fila de acabamento e os coloca em uma lista de objetos marcados como prontos para o acabamento. Entradas neste ponto de lista os objetos na heap gerenciada que estão prontos ter seu código de acabamento chamado. O coletor de lixo chama os métodos de Finalize para os objetos na lista e em seguida as entradas de lista. Uma coleta de lixo futura determinará que objetos finalizados são realmente lixo porque eles são apontados não pelas entradas na lista de objetos marcados como prontos para o acabamento. Nesta coleta de lixo futura, a memória de objetos é recuperada realmente.

Consulte também

Referência

Finalize

Conceitos

Substituindo o método Finalize

Sintaxe de destruidores em C# e C++