Dispose()
no se llamará automáticamente. Si hay un finalizador se llamará automáticamente. La implementación de IDisposable
proporciona una forma para que los usuarios de su clase liberen los recursos temprano, en lugar de esperar al recolector de elementos no utilizados.
La forma preferible para un cliente es utilizar la instrucción using
que maneja llamadas automáticas de Dispose()
incluso si hay excepciones.
Una aplicación adecuada de IDisposable
es:
class MyClass : IDisposable
{
private bool disposed = false;
void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// Manual release of managed resources.
}
// Release unmanaged resources.
disposed = true;
}
}
~MyClass() { Dispose(false); }
}
Si el usuario de la clase llama Dispose()
la limpieza se lleva a cabo directamente. Si el objeto es atrapado por el recolector de basura, llama al Dispose(false)
para hacer la limpieza. Tenga en cuenta que cuando se llama desde el finalizador (el método ~MyClass
) las referencias administradas pueden no ser válidas, por lo que solo se pueden liberar recursos no administrados.