Dispose Pattern
Normalerweise muss IDisposable nur in folgenden Fällen implementiert werden:
- Eine Klasse erstellt unmanaged-Ressourcen (z.B. GDI Objekte) und gibt diese nicht sofort wieder frei (z.B. mit einem using-Block).
- Eine Klasse erstellt Instanzen anderer Klassen die IDisposable implementieren.
Beispielimplementation von IDisposable:
class XYZ : IDisposable
{
private bool disposed = false;
private Stream resource;
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!disposed)
{
if (disposing)
{
resource?.Dispose();
// free other managed ressources here
}
// free any unmanaged ressources here
// Indicate that the instance has been disposed.
resource = null;
disposed = true;
}
}
// Implement only if your class contains unmanaged ressources!
~XYZ()
{
Dispose(false);
}
}
Der Finalizer ~XYZ()
sollte nur Implementiert werden, falls eine Klasse direkt unmanaged-Ressourcen enthält. Er stellt sicher, dass diese unmanaged-Ressourcen auch freigegeben werden ohne dass Dispose() aufgerufen wird.
Kommentare
Kommentare sind geschlossen.