Partilhar via


Finalizar métodos and Destructors

Para a maioria dos objetos que sua plaicação cria, você pode confiar no coletor de lixo do .NET estrutura 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 liberar explicitamente recursos não gerenciados quando tiver terminado de usá-los em seu aplicativo.O tipo mais comum de recurso não gerenciado é um objeto que envolve um recurso do sistema operacional, sistema autônomo um arquivo, janela ou conexão de rede.Embora o coletor de lixo seja capaz de 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 estrutura fornece a Método Object.Finalize, que permite que um objeto limpar seus recursos não gerenciados corretamente quando o coletor de lixo recupera a memória usada pelo objeto.Por padrão, a Finalizar método não fará nada.Se você desejar que o coletor de lixo para executar operações de limpeza em seu objeto antes que ele recupera a memória do objeto, você deve substituir o Finalizar método na classe.

Observação:

Para implementar o Finalizar método no translation from VPE for Csharp, você deve usar sintaxe do destruidor.No .NET estrutura versão 2.0, Visual C++ fornece sua própria sintaxe para implementar o Finalize método, conforme descrito em Destruidores e Finalizers em Visual C++. No .NET estrutura versão 1.0 e 1.1, Visual C++ usado destruidor sintaxe para o Finalize método, sistema autônomo translation from VPE for Csharp faz.

O coletor de lixo mantém o controle dos objetos que possuem Finalizar métodos, usar uma estrutura interna chamada fila de finalização.Cada time seu aplicativo cria um objeto que tem um Finalizar método, o coletor de lixo coloca uma entrada na fila de finalização que aponta para esse objeto.Fila de finalização contém entradas para todos os objetos a gerenciado heap precisa ter seu código de finalização chamado antes que o coletor de lixo pode recuperar sua memória.

Observação:

O exemplo de código fornecido para o GC.KeepAlive método mostra como agressivo lixo coleção pode causar um finalizador para ser executado enquanto ainda está executando um membro do objeto recuperado e como usar o KeepAlive método para evitar isso.

A Finalize método não deve lançar exceções, porque eles não podem ser manipulados pelo aplicativo e podem fazer com que o aplicativo terminar.

Implementação de Finalizar métodos ou destruidores podem ter um impacto negativo no desempenho e você deve evitar usá-los desnecessariamente.Recuperar a memória usada pelos objetos com Finalizar métodos requer pelo menos duas coleções de lixo.Quando o coletor de lixo executa uma coleção, ele recupera a memória para objetos inacessíveis sem os finalizadores.Neste momento, ele não pode coletar os objetos inacessíveis que tem os finalizadores.Em vez disso, remove sistema autônomo entradas para esses objetos da fila de finalização e coloca em uma lista de objetos marcada sistema autônomo prontos para finalização.Entradas nesta lista apontem para os objetos na heap gerenciada que estiverem prontos para que o seu código de finalização chamado.O coletor de lixo chamar o Finalizar métodos para os objetos nesta lista e remove as entradas da lista.Uma coleta de lixo futuras irá determinar que objetos finalizados são realmente lixo porque eles não são apontados por entradas na lista de objetos marcada sistema autônomo prontos para finalização.Nesta coleção lixo futura, de memória os objetos, na verdade, é recuperada.

Consulte também

Conceitos

Substituindo o método de finalização

Sintaxe do destruidor em translation from VPE for Csharp e C++

Referência

Finalize