Tracks
/
C#
C#
/
Temario
/
Limpieza de recursos
Li

Limpieza de recursos en C#

2 ejercicios

Acerca de Limpieza de recursos

La interfaz IDisposable es fundamental para la limpieza de recursos y desempeña dos papeles importantes en C#:

  • Indica a quienes usan la clase que la implementa que son responsables de comunicarle a la clase (llamando al método Dispose()) que ya no se necesita, de modo que pueda liberar los recursos no administrados que corresponda o restablecer su estado interno según convenga. Esto contrasta con el enfoque habitual de la limpieza, que consiste en dejar que el recolector de basura se encargue de todo (principalmente, de liberar memoria).
  • Junto con el compilador y el entorno de ejecución, la interfaz IDisposable da soporte a la instrucción using que se explica en el ejercicio resource-lifetime.

Es posible, aunque poco probable, que se llame a Dispose() a través de la interfaz en algún tipo de rutina genérica de limpieza.

IDisposable aparece con más frecuencia en clases de biblioteca que envuelven recursos del sistema operativo (no administrados), como System.IO.Stream y System.IO.TextReader. (Los Stream y los TextReader se tratan en otros ejercicios).

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

Si una clase que estás usando implementa la interfaz IDispoable, debes asegurarte de que se llame a Dispose() (mediante cláusulas catch y finally) cuando la instancia ya no se necesite. Si una clase tiene un miembro que implementa IDisposable, es muy posible que ella misma tenga que implementar IDisposable para que se pueda llamar a Dispose() y liberar así el miembro que implementa IDisposble.

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

La interfaz IDisposable puede ser útil incluso cuando no hay recursos no administrados de por medio. Supón que tienes un objeto de larga vida que necesita que otros objetos de corta vida se registren en él y se den de baja cuando ya no se necesiten. Implementar IDisposable en el objeto de corta vida advierte a quien use esa clase de que hay que llamar a Dispose() al final de la vida del objeto de corta vida.

Patrón Dispose

En la documentación verás referencias al patrón Dispose. El patrón Dispose incluye llamar a Dispose() desde el finalizador de una clase y asegurarse de que la liberación de recursos en las clases base se gestiona correctamente. El patrón Dispose se trata en un ejercicio posterior.

El patrón Dispose está relacionado sobre todo con recursos no administrados. Si usas el mecanismo P/Invoke y métodos extern, necesitas entender cómo y cuándo implementar el patrón Dispose. La mayoría de los desarrolladores de C# rara vez tienen que tratar directamente con recursos no administrados de esta forma.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Limpieza de recursos

La práctica está bloqueada

Desbloquea 1 ejercicio más para practicar Limpieza de recursos