Lo que sigue es un ejemplo típico patrón de disponer:¿Por qué invocar dispose (false) en el destructor?
public bool IsDisposed { get; private set; }
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!IsDisposed)
{
if (disposing)
{
//perform cleanup here
}
IsDisposed = true;
}
}
~MyObject()
{
Dispose(false);
}
entiendo lo deseche hace, pero lo que no entiendo es por qué usted quiere llamar a disponer (falso) en el destructor? Si nos fijamos en la definición, no haría absolutamente nada, entonces ¿por qué alguien escribiría un código como este? ¿No tendría sentido simplemente llamar deshacerse del destructor?
Pero tenga en cuenta que si no tiene recursos no administrados, 'Dispose (false)' no tiene exactamente nada que ver, por lo que no necesita un finalizador ni un 'Dispose (bool)' en absoluto. Siento que el patrón estándar es demasiado complicado para atender casos de uso que casi nunca ocurren (y cuando lo hacen probablemente sean una mala idea). Este es uno que prefiero: http://nitoprograms.blogspot.com/2009/08/how-to-implement-disposable-and.html –
@romkyns "El uso principal de [IDisposable] es liberar recursos no administrados". (http://msdn.microsoft.com/en-us/library/System.IDisposable.aspx) Por lo tanto, no es sorprendente que la forma estándar de implementar IDisposable sea más de lo que necesita si no tiene recursos no administrados. No estoy seguro de lo que quiere decir con "casos de uso que casi nunca ocurren": tener una combinación de recursos administrados y no administrados no es un caso de uso oscuro. –
Dicho esto, acepto que si el finalizador no está haciendo nada (porque no tiene recursos no administrados), entonces no lo necesita. Como la mayoría de los patrones (como casi cualquier cosa, supongo), tiene sentido usarlo donde tenga sentido. ;) –