Limpando recursos não gerenciadosCleaning Up Unmanaged Resources

Para a maioria dos objetos criados pelo aplicativo, você pode contar com o coletor de lixo do .NET Framework para lidar com o gerenciamento de memória.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. No entanto, ao criar objetos que incluem recursos não gerenciados, você deverá liberar os recursos explicitamente assim que terminar de usá-los no aplicativo.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. 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 bancos de dados.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. Embora o coletor de lixo consiga controlar 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.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

Se seus tipos usam recursos não gerenciados, você deve fazer o seguinte:If your types use unmanaged resources, you should do the following:

  • Implementar o padrão de descarte.Implement the dispose pattern. Isso exige que você forneça uma implementação de IDisposable.Dispose para habilitar a liberação determinística dos recursos não gerenciados.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Um consumidor do seu tipo chama Dispose quando o objeto (e os recursos que ele usa) não são mais necessários.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. O método Dispose libera imediatamente os recursos não gerenciados.The Dispose method immediately releases the unmanaged resources.

  • Fazer com que seus recursos não gerenciados sejam liberados se um consumidor do seu tipo esquecer chamar Dispose.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Há duas formas de fazer isso:There are two ways to do this:

    • Usar um identificador seguro para encapsular o recurso não gerenciado.Use a safe handle to wrap your unmanaged resource. Esta é a técnica recomendada.This is the recommended technique. Os identificadores seguros são derivados da classe System.Runtime.InteropServices.SafeHandle e incluem um método Finalize robusto.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. Ao usar um identificador seguro, você simplesmente implementa a interface IDisposable e chama o método Dispose do seu identificador seguro em sua implementação do IDisposable.Dispose.When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. O finalizador do identificador seguro é chamado automaticamente pelo coletor de lixo quando seu método Dispose não é chamado.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      —ou——or—

    • Substituir o método Object.Finalize.Override the Object.Finalize method. 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.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. No entanto, como 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.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

Os consumidores do seu tipo poderão então chamar sua implementação de IDisposable.Dispose diretamente para liberar a memória usada pelos recursos não gerenciados.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. 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.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

Nesta seçãoIn This Section

Implementar um método de descarte Descreve como implementar o padrão de descarte para liberar recursos não gerenciados.Implementing a Dispose Method Describes how to implement the dispose pattern for releasing unmanaged resources.

Usar objetos que implementam IDisposable Descreve como os consumidores de um tipo garantem que sua implementação de Dispose seja chamada.Using Objects That Implement IDisposable Describes how consumers of a type ensure that its Dispose implementation is called. Recomendamos usar a instrução using do C# ou a instrução Using do Visual Basic para fazer isso.We recommend using the C# using statement or the Visual Basic Using statement to do this.

ReferênciaReference

System.IDisposable
Define o método Dispose para liberar recursos não gerenciados.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
Cuida da finalização de objetos quando os recursos não gerenciados não são liberados pelo método Dispose.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Suprime a finalização.Suppresses finalization. Este método geralmente é chamado de um método Dispose para impedir a execução de um finalizador.This method is customarily called from a Dispose method to prevent a finalizer from executing.