Sobes.tech
Middle

Was ist die Schnittstelle IDisposable und wofür wird sie in C# verwendet?

sobes.tech KI

Antwort von AI

IDisposable — ist eine Schnittstelle, die einen Mechanismus zum Freigeben von nicht verwalteten Ressourcen bereitstellt. Sie enthält eine Methode Dispose().

Sie wird verwendet für:

  • Freigabe nicht verwalteter Ressourcen: wie Dateideskriptoren, Datenbankverbindungen, Netzsockets. .NET kann diese Ressourcen nicht automatisch verwalten.
  • Bereinigung nach der Verwendung: stellt sicher, dass ressourcenintensive Objekte korrekt freigegeben werden, auch wenn Ausnahmen auftreten.
  • Gemeinsame Nutzung mit dem using-Operator: Der using-Operator ruft die Methode Dispose() automatisch am Ende des Codeblocks auf, auch wenn eine Ausnahme auftritt. Dies ist die bevorzugte Methode, um Objekte zu verwenden, die IDisposable implementieren.

Beispiel für eine Implementierung:

public class MyResource : IDisposable
{
    // Simulation einer nicht verwalteten Ressource
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Zuweisung einer nicht verwalteten Ressource
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // Dispose-Methode aus der IDisposable-Schnittstelle
    public void Dispose()
    {
        Dispose(true);
        // Finalisierung unterdrücken, da die Ressourcen bereits freigegeben wurden
        GC.SuppressFinalize(this);
    }

    // Virtuelle Methode zur Implementierung der Freigabelogik
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Freigabe verwalteter Ressourcen, falls vorhanden
                // ...
            }

            // Freigabe nicht verwalteter Ressourcen
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizer (Destruktor) zur Freigabe der Ressourcen, falls Dispose nicht explizit aufgerufen wurde
    ~MyResource()
    {
        Dispose(false);
    }
}

Beispiel für die Verwendung mit using:

using (var resource = new MyResource())
{
    // Arbeit mit der Ressource
    // ...
} // Dispose() wird automatisch beim Verlassen des using-Blocks aufgerufen