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. |