Quello che segue è un esempio tipico pattern Dispose:Perché chiamare dispose (false) nel distruttore?
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);
}
Capisco quello smaltire fa, ma quello che non capisco è perché si vuole chiamare Dispose (false) nel distruttore? Se guardi la definizione, non farebbe assolutamente nulla, quindi perché qualcuno dovrebbe scrivere un codice come questo? Non avrebbe senso solo chiamare non dal distruttore?
Ma osservate che se non avete risorse non gestite allora 'Dispose (false)' non ha esattamente nulla da fare - quindi non avete bisogno di un finalizzatore o di un 'Dispose (bool)'. Sento che il modello standard è eccessivamente complicato per soddisfare casi d'uso che non si verificano quasi mai (e quando lo fanno sono probabilmente una cattiva idea). Ecco uno Preferisco di gran lunga: http://nitoprograms.blogspot.com/2009/08/how-to-implement-idisposable-and.html –
@romkyns "L'uso primario di [IDisposable] è quello di liberare risorse non gestite." (http://msdn.microsoft.com/en-us/library/System.IDisposable.aspx) Quindi non sorprende che il modo standard di implementare IDisposable sia più del necessario se non si dispone di risorse non gestite. Non sono sicuro di cosa intenda per "casi d'uso che non si verificano quasi mai" - avere un mix di risorse gestite e non gestite non è un caso d'uso oscuro. –
Detto questo, sono d'accordo che se il finalizzatore non sta facendo nulla (perché non hai risorse non gestite), allora non ne hai bisogno. Come la maggior parte degli schemi (come quasi tutto, suppongo), ha senso solo usarlo dove ha senso. ;) –