Compartilhar via


Limpar recursos não gerenciados

Para a maioria dos objetos que seu aplicativo cria, você pode contar com o coletor de lixo .NET para lidar com o gerenciamento de memória. No entanto, ao criar objetos que incluem recursos não gerenciados, você deve liberar explicitamente esses recursos quando terminar de usá-los. Os tipos mais comuns de recursos não gerenciados são objetos que encapsulam recursos do sistema operacional, como arquivos, janelas, conexões de rede ou conexões de banco de dados. Embora o coletor de lixo seja capaz de acompanhar o tempo de vida de um objeto que encapsula um recurso não gerenciado, ele não sabe como liberar e limpar o recurso não gerenciado.

Se seus tipos usarem recursos não gerenciados, você deverá fazer o seguinte:

  • Implemente o padrão de descarte. Isso exige que você forneça uma IDisposable.Dispose implementação para habilitar a liberação determinística de recursos não gerenciados. Um consumidor do seu tipo chama Dispose quando o objeto (e os recursos que ele usa) não são mais necessários. O Dispose método libera imediatamente os recursos não gerenciados.

  • No caso de um consumidor do seu tipo esquecer de chamar Dispose, forneça uma maneira para que seus recursos não gerenciados sejam liberados. Há duas maneiras de fazer isso:

    • Usar um identificador seguro para encapsular o recurso não gerenciado. Essa é a técnica recomendada. Os identificadores seguros são derivados da classe abstrata System.Runtime.InteropServices.SafeHandle e incluem um método Finalize robusto. Ao usar um identificador seguro, basta implementar a interface IDisposable e chamar o método Dispose do seu identificador seguro na implementação IDisposable.Dispose. O finalizador do identificador seguro é chamado automaticamente pelo coletor de lixo quando seu método Dispose não é chamado.

      ou

    • Defina um finalizador. A finalização habilita a liberação não determinística de recursos não gerenciados quando o consumidor de um tipo não chama IDisposable.Dispose para fazer o descarte de forma determinística.

      Aviso

      A finalização de objetos pode ser uma operação complexa e propensa a erros. Recomendamos que você utilize um handle seguro em vez de fornecer seu próprio finalizador.

Os consumidores do seu tipo podem então chamar sua IDisposable.Dispose implementação diretamente para liberar a memória usada por recursos não gerenciados. Quando você implementa corretamente um método Dispose, o método Finalize do seu identificador seguro ou sua própria substituição do método Object.Finalize torna-se uma proteção para limpar recursos para o caso do método Dispose não ser chamado.

Nesta seção

Implementar um método Dispose descreve como implementar o padrão de descarte para liberar recursos não gerenciados.

Usar objetos que implementam IDisposable descreve como os consumidores de um tipo garantem que a implementação Dispose seja chamada. É altamente recomendável usar a instrução C# using (ou Visual Basic Using) para fazer isso.

Referência

Tipo/Membro Descrição
System.IDisposable Define o Dispose método para liberar recursos não gerenciados.
Object.Finalize Fornece a finalização do objeto se os recursos não gerenciados não forem liberados pelo Dispose método.
GC.SuppressFinalize Suprime a finalização. Esse método costuma ser chamado pelo método Dispose para impedir a execução de um finalizador.