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.