Feedback

C# - Dispose implementieren

Veröffentlicht von am 2/24/2006
(8 Bewertungen)
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
}
Abgelegt unter Dispose, Destruktor, implementieren.

1 Kommentare zum Snippet

Vertexwahn schrieb am 2/27/2006:
http://www.dotnetpro.de/articles/freearticles/pdf/2005-05-Dispose.pdf
 

Logge dich ein, um hier zu kommentieren!

Ähnliche Snippets