La interfaz IDisposable es fundamental para la limpieza de recursos y tiene dos roles importantes en C#:
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).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.
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.