Vielleicht nützt euch die Implementierung, die ich in meinen Klassen verwende.
//#######################################################################
// Close, IDisposable.Dispose, Dispose (bool) und Destruktor (= Finalize)
//
// Die eigentliche Logik findet in Dispose (bool) statt. Deshalb ist
// Dispose (bool) auch virtual. Unterklassen können hier die
// Funktionalität der Objektzerstörung erweitern.
//
// Alle anderen Methoden rufen nur direkt oder indirekt Dispose (bool)
// auf. Deshalb sind sie absichtlich nicht virtual.
//
// - Close ist für die Verwendung durch den Benutzer der Klasse gedacht.
//
// - IDisposable.Dispose dagegen die Implementierung von der IDisposable
// Schnittstelle gedacht und wird z.B. bei Verwendung der
// using-Anweisung aufgerufen.
// (Man sieht, dass in diesem Fall Close umgangen wird, aber deshalb
// ist Close ja auch nicht virtual.)
//
// - Der Destruktor ist für den Aufruf durch den GC gedacht.
//
// Durch den Parameter von Dispose (bool) kann man unterscheiden, ob
// Dispose (bool) vom Benutzer oder vom CG aufgerufen wurde. Da beim
// Aufruf durch den CG die enthalteten Objekte schon garbage-collected
// sein können, darf man auf diese nicht mehr zugreifen.
//
// Optional: Wenn die Bezeichnung 'Close' für das Beenden der Lebensdauer
// von Objekten einer Klasse unzutreffend oder irreführend wäre, kann
// man auch den Namen 'Close' durch 'Dispose' ersetzen, ohne die
// Implementierung zu ändern. Die andere Option für diesen Fall wäre,
// die Close-Methode zu entfernen und 'IDisposable.Dispose' in 'Dispose'
// umzubenennen.
//
//#######################################################################
//=======================================================================
public void Close ()
{
((IDisposable)this).Dispose ();
}
//=======================================================================
void IDisposable.Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
//=======================================================================
~MyClass ()
{
Dispose (false);
}
//=======================================================================
protected virtual void Dispose (bool fDisposing)
{
if (fDisposing) {
// Hier die verwalteten Ressourcen freigeben
}
// Hier die unverwalteten Ressourcen freigeben
}
1 Kommentare zum Snippet