Limpiar recursos no administradosCleaning Up Unmanaged Resources

En el caso de la mayoría de los objetos creados por la aplicación, puede usar el recolector de elementos no utilizados de .NET para administrar la memoria.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. No obstante, cuando se crean objetos que incluyen recursos no administrados, debe liberar explícitamente dichos recursos cuando termine de utilizarlos en la aplicación.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. Los tipos más comunes de recurso no administrado son objetos que contienen recursos del sistema operativo, como archivos, ventanas, conexiones de red o conexiones de bases de datos.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. Aunque el recolector de elementos no utilizados puede realizar el seguimiento de la duración de un objeto que encapsula un recurso no administrado, no conoce cómo liberar y limpiar el recurso no administrado.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.

Si sus tipos utilizan recursos no administrados, debe hacer lo siguiente:If your types use unmanaged resources, you should do the following:

  • Implementar el patrón Dispose.Implement the dispose pattern. Para esto es necesario proporcionar una implementación IDisposable.Dispose a fin de habilitar la liberación de recursos no administrados de forma determinista.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Un consumidor de su tipo llama a Dispose cuando el objeto (y los recursos que utiliza) ya no se necesita.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. El método Dispose libera inmediatamente los recursos no administrados.The Dispose method immediately releases the unmanaged resources.

  • Planifique la liberación de los recursos no administrados en el caso de que un consumidor de su tipo olvide llamar a Dispose.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Existen dos modos para hacer esto:There are two ways to do this:

    • Utilizar un controlador seguro para incluir el recurso no administrado.Use a safe handle to wrap your unmanaged resource. Esta es la técnica recomendada.This is the recommended technique. Los controladores seguros se derivan de la clase System.Runtime.InteropServices.SafeHandle e incluyen un método Finalize eficaz.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. Al usar un controlador seguro, simplemente se implementa la interfaz IDisposable y se llama al método Dispose del controlador seguro en la implementación 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. El recolector de elementos no utilizados llama automáticamente al finalizador del controlador seguro si no se llama a su método Dispose.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      -O bien-—or—

    • Invalide el método Object.Finalize.Override the Object.Finalize method. La finalización habilita la liberación de forma no determinista de recursos no administrados cuando el consumidor de un tipo no llama a IDisposable.Dispose para deshacerse de ellos de forma determinista.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. Sin embargo, como la finalización del objeto puede ser una operación compleja y propensa a errores, se recomienda usar un controlador seguro en lugar de proporcionar su propio 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.

Los consumidores de su tipo pueden entonces llamar a la implementación IDisposable.Dispose directamente para liberar la memoria que utilizan los recursos no administrados.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. Cuando se implementa correctamente un método Dispose, el método Finalize del controlador seguro o su propia invalidación del método Object.Finalize actúa como medida de seguridad para limpiar los recursos en caso de que no se llame al método Dispose.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.

En esta secciónIn This Section

Implementar un método DisposeImplementing a Dispose Method
Describe cómo implementar el patrón de Dispose para liberar recursos no administrados.Describes how to implement the dispose pattern for releasing unmanaged resources.

Uso de objetos que implementan IDisposableUsing Objects That Implement IDisposable
Describe cómo los consumidores de un tipo garantizan que se llame a su implementación Dispose.Describes how consumers of a type ensure that its Dispose implementation is called. Se recomienda utilizar la instrucción using de C# o la instrucción Using Visual Basic para realizar este procedimiento.We recommend using the C# using statement or the Visual Basic Using statement to do this.

ReferenciaReference

System.IDisposable
Define el método Dispose para liberar recursos no administrados.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
Proporciona la finalización del objeto si el método Dispose no libera los recursos no administrados.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Suprime la finalización.Suppresses finalization. Se llama a este método de forma personalizada desde un método Dispose para impedir que se ejecute un finalizador.This method is customarily called from a Dispose method to prevent a finalizer from executing.