Compartilhar via


Finalizar métodos e destrutores

Para a maioria dos objetos que cria a seu aplicativo, você pode contar com o.Coletor de lixo do NET Framework implicitamente executar todas as tarefas de gerenciamento de memória necessárias. No entanto, quando você cria objetos que encapsulam os recursos não gerenciados, você deve explicitamente a liberar os recursos não gerenciados quando tiver terminado de usá-los em seu aplicativo. O tipo mais comum de recursos não gerenciados é um objeto que encapsula um recurso do sistema operacional, como, por exemplo, um arquivo, uma janela ou uma 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 Framework fornece a o método de Object.Finalize, que permite que um objeto limpar seus recursos não gerenciados adequadamente quando o coletor de lixo recupera a memória usada pelo objeto. Por padrão, o Finalize método não fará nada. Se desejar que o coletor de lixo executar operações de limpeza em seu objeto antes que ele recupera a memória do objeto, você deve substituir o Finalize método na sua classe.

Observação

Para implementar a Finalize método no C#, você deve usar sintaxe do destruidor.No.NET Framework versão 2.0, Visual C++ fornece sua própria sintaxe para implementar o Finalize método, conforme descrito em Destructors and Finalizers in Visual C++.No.NET Framework versão 1.0 e 1.1, Visual C++ usavam a sintaxe do destruidor para o Finalize o método, como C# faz.

O coletor de lixo mantém o controle dos objetos que possuem Finalize métodos, usando uma estrutura interna de fila de finalização de chamada. Cada vez que seu aplicativo cria um objeto tem um Finalize 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 no heap gerenciado que precisam ter o 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 a coleta de lixo agressivo pode causar um finalizador seja executado enquanto um membro do objeto recuperado é ainda em execução 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 seja encerrado.

Implementação de Finalize métodos ou destruidores podem ter um impacto negativo no desempenho e deve evitar usá-los desnecessariamente. Recuperar a memória usada pelos objetos com Finalize métodos requer pelo menos duas coletas de lixo. Quando o coletor de lixo executa uma coleta, ele recupera a memória para objetos inacessíveis sem finalizadores. Nesse momento, ele não pode coletar os objetos inacessíveis que tenham finalizadores. Em vez disso, ele remove as entradas para esses objetos de fila de finalização e coloca-os em uma lista de objetos marcados como prontos para finalização. Entradas nesta lista apontem para os objetos no heap gerenciado estão prontos para que o seu código de finalização chamado. As chamadas de coletor de lixo do Finalize métodos para os objetos nesta lista e remove as entradas da lista. Uma coleta de lixo futuras determinará que os objetos finalizados são realmente lixo porque eles não são apontados por entradas na lista de objetos marcados como prontos para finalização. Nesta futura coleta de lixo, os objetos' memória realmente é recuperada.

Consulte também

Referência

Finalize

Conceitos

Substituindo o método de finalizar

Sintaxe do destruidor em C# e C++