Limpiar recursos no administrados

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. No obstante, cuando se crean objetos que incluyen recursos no administrados, debe liberar explícitamente dichos recursos cuando termine de usarlos. Los tipos más comunes de recursos no administrados son objetos que contienen recursos del sistema operativo, como archivos, ventanas, conexiones de red o conexiones de bases de datos. 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.

Si sus tipos utilizan recursos no administrados, debe hacer lo siguiente:

  • Implementar el patrón Dispose. Para ello es necesario proporcionar una implementación IDisposable.Dispose a fin de permitir la liberación determinista de recursos no administrados. Un consumidor de su tipo llama a Dispose cuando el objeto, y los recursos que utiliza, ya no se necesitan. El método Dispose libera inmediatamente los recursos no administrados.

  • En caso de que un consumidor de su tipo olvide llamar a Dispose, proporcione una manera de liberar los recursos no administrados. Existen dos modos para hacer esto:

    • Utilizar un controlador seguro para incluir el recurso no administrado. Esta es la técnica recomendada. Los controladores seguros se derivan de la clase System.Runtime.InteropServices.SafeHandle abstracta e incluyen un método Finalize eficaz. 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. El recolector de elementos no utilizados llama automáticamente al finalizador del controlador seguro si no se llama a su método Dispose.

      o

    • Invalide el método Object.Finalize . 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. Defina un finalizador mediante la invalidación del método Object.Finalize.

    Advertencia

    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.

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

En esta sección

En Implementar un método Dispose se describe cómo implementar el patrón de eliminación para liberar recursos no administrados.

En Uso de objetos que implementan IDisposable se describe cómo los consumidores de un tipo garantizan que se llame a su implementación de Dispose. Para realizar este procedimiento, se recomienda usar la instrucción using de C# (o la instrucción Using de Visual Basic).

Referencia

Tipo o miembro Descripción
System.IDisposable Define el método Dispose para liberar recursos no administrados.
Object.Finalize Proporciona la finalización del objeto si el método Dispose no libera los recursos no administrados.
GC.SuppressFinalize Suprime la finalización. Se llama a este método de forma personalizada desde un método Dispose para impedir que se ejecute un finalizador.