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 tiene dos roles importantes en C#:

  • Les indica a quienes usan la clase que la implementa que son responsables de avisarle a la clase (llamando al método Dispose()) que ya no se la necesita, para que pueda liberar los recursos no administrados o restablecer su estado interno según corresponda. Esto contrasta con el enfoque habitual de la limpieza, que consiste en dejar que el recolector de basura se encargue de todo (principalmente, liberar memoria).
  • Junto con el compilador y el entorno de ejecución, la interfaz IDisposable habilita la sentencia using que se trata 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 de limpieza genérica.

IDisposable aparece con mayor 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, entonces debes asegurarte de que se llame a Dispose() (mediante el uso de 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 deba implementar IDisposable para que se pueda llamar a Dispose() y así liberar 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 los objetos de vida corta se registren en él y luego se den de baja cuando ya no se necesiten. Implementar IDisposable en el objeto de vida corta le advierte a quien use esa clase que debe llamar a Dispose() al final de la vida del objeto de vida corta.

El patrón de Dispose

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

El patrón de Dispose se relaciona sobre todo con los recursos no administrados. Si usas el mecanismo P/Invoke y métodos extern, entonces necesitas entender cómo y cuándo implementar el patrón de Dispose. La mayoría de quienes programan en C# rara vez tiene que tratar directamente con recursos no administrados de esta manera.

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

Aprende Limpieza de recursos

La práctica está bloqueada

Desbloquea 1 ejercicio más para practicar Limpieza de recursos