Limpeza de recursos não geridos

Para a maioria dos objetos criados pelo seu aplicativo, você pode confiar no 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 rastrear 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 usam recursos não gerenciados, você deve fazer o seguinte:

  • Implemente o padrão de eliminação. Isso requer 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.

  • Caso um consumidor do seu tipo se esqueça de ligar Dispose, forneça uma maneira para que seus recursos não gerenciados sejam liberados. Poderá fazê-lo de duas formas:

    • Use um identificador seguro para encapsular seu recurso não gerenciado. Esta é a técnica recomendada. As alças seguras são derivadas da classe abstrata e incluem um método robusto System.Runtime.InteropServices.SafeHandleFinalize . Quando você usa um identificador seguro, você simplesmente implementa a interface e chama o IDisposable método do Dispose identificador seguro em sua IDisposable.Dispose implementação. O finalizador da alça segura é chamado automaticamente pelo coletor de lixo se seu Dispose método não for chamado.

      ou

    • Defina um finalizador. A finalização permite a liberação não determinística de recursos não gerenciados quando o consumidor de um tipo não chama IDisposable.Dispose para descartá-los deterministicamente.

      Aviso

      A finalização de objetos pode ser uma operação complexa e propensa a erros, recomendamos que você use um identificador 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 Dispose método, o método do Finalize identificador seguro ou sua Object.Finalize própria substituição do método se torna uma salvaguarda para limpar recursos no caso de o Dispose método não ser chamado.

Nesta secção

Implementando 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 sua Dispose implementação seja chamada. É altamente recomendável usar a instrução C# using (ou o Visual Basic Using) para fazer isso.

Referência

Tipo / Membro Description
System.IDisposable Define o Dispose método para liberar recursos não gerenciados.
Object.Finalize Fornece a finalização do objeto se os Dispose recursos não gerenciados não forem liberados pelo método.
GC.SuppressFinalize Suprime a finalização. Este método é normalmente chamado a partir de um Dispose método para impedir que um finalizador seja executado.