Compartir a través de


Limpieza de recursos no administrados

Para la mayoría de los objetos que crea la aplicación, puede confiar en el recolector de elementos no utilizados de .NET para controlar la administración de memoria. Sin embargo, al crear objetos que incluyan recursos no administrados, debe liberar explícitamente esos recursos cuando termine de usarlos. Los tipos más comunes de recursos no administrados son objetos que encapsulan los recursos del sistema operativo, como archivos, ventanas, conexiones de red o conexiones de base de datos. Aunque el recolector de elementos no utilizados puede realizar un seguimiento de la duración de un objeto que encapsula un recurso no administrado, no sabe 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. Esto requiere que proporcione una IDisposable.Dispose implementación para permitir la liberación determinista de recursos no administrados. Un consumidor de su tipo llama Dispose cuando el objeto (y los recursos que usa) ya no son necesarios. El Dispose método 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. Hay dos maneras de hacerlo:

    • Use un identificador seguro para encapsular 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 identificador seguro, simplemente implemente la interfaz IDisposable y llame al método de su identificador seguro Dispose en su 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

    • Defina un finalizador. 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.

      Advertencia

      La finalización de objetos puede ser una operación compleja y propensa a errores; recomendamos usar un identificador 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

La implementación de un método Dispose describe cómo implementar el patrón dispose 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. Se recomienda encarecidamente usar la instrucción C# using (o Visual Basic Using) para hacerlo.

Referencia

Tipo o miembro Descripción
System.IDisposable Define el Dispose método para liberar recursos no administrados.
Object.Finalize Proporciona la finalización de objetos si el Dispose método no libera los recursos no administrados.
GC.SuppressFinalize Suprime la finalización. Este método se llama habitualmente desde un método Dispose para evitar que un finalizador se ejecute.