Tracks
/
C#
C#
/
Lehrplan
/
Ressourcenbereinigung
Re

Ressourcenbereinigung in C#

2 Übungen

Über Ressourcenbereinigung

Die IDisposable-Schnittstelle ist zentral für das Aufräumen von Ressourcen und spielt in C# zwei wichtige Rollen:

  • Sie macht den Nutzern der implementierenden Klasse klar, dass sie dafür verantwortlich sind, der Klasse mitzuteilen (indem sie die Dispose()-Methode aufrufen), dass sie nicht mehr benötigt wird, damit sie nicht verwaltete Ressourcen freigeben oder ihren internen Zustand nach Bedarf zurücksetzen kann. Das steht im Gegensatz zum üblichen Vorgehen beim Aufräumen, bei dem der Garbage Collector alles aufräumt (in erster Linie Speicher freigibt).
  • Zusammen mit dem Compiler und der Laufzeit unterstützt die IDisposable-Schnittstelle die using-Anweisung, die in der Übung resource-lifetime behandelt wird.

Es ist möglich, aber unwahrscheinlich, dass Dispose() über die Schnittstelle in irgendeiner generischen Aufräumroutine aufgerufen wird.

Am häufigsten begegnet man IDisposable bei Bibliotheksklassen, die Betriebssystemressourcen (nicht verwaltete Ressourcen) umschließen, wie etwa System.IO.Stream und System.IO.TextReader. (Streams und TextReaders werden in anderen Übungen behandelt).

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

Wenn eine Klasse, die du verwendest, die IDispoable-Schnittstelle implementiert, musst du sicherstellen, dass Dispose() aufgerufen wird (mit catch- und finally-Klauseln), wenn die Instanz nicht mehr benötigt wird. Wenn eine Klasse ein Member enthält, das IDisposable implementiert, muss sie womöglich selbst IDisposable implementieren, damit Dispose() aufgerufen werden kann, um das Member freizugeben, das IDisposble implementiert.

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

Die IDisposable-Schnittstelle kann auch dann nützlich sein, wenn keine nicht verwalteten Ressourcen im Spiel sind. Angenommen, du hast ein langlebiges Objekt, das erfordert, dass sich kurzlebige Objekte bei ihm registrieren und sich wieder abmelden, wenn sie nicht mehr benötigt werden. Wenn du IDisposable für das kurzlebige Objekt implementierst, weiß ein Entwickler, der diese Klasse verwendet, dass Dispose() am Ende der Lebensdauer des kurzlebigen Objekts aufgerufen werden muss.

Dispose-Muster

In der Dokumentation wirst du Verweise auf das Dispose-Muster sehen. Das Dispose-Muster umfasst, Dispose() aus dem Finalizer einer Klasse aufzurufen und sicherzustellen, dass die Freigabe von Ressourcen in Basisklassen korrekt behandelt wird. Das Dispose-Muster wird in einer späteren Übung behandelt.

Das Dispose-Muster bezieht sich hauptsächlich auf nicht verwaltete Ressourcen. Wenn du den P/Invoke-Mechanismus und extern-Methoden verwendest, musst du verstehen, wie und wann du das Dispose-Muster implementierst. Die meisten C#-Entwickler müssen sich selten auf diese Weise direkt mit nicht verwalteten Ressourcen befassen.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Ressourcenbereinigung

Das Üben ist gesperrt

Schalte 1 weitere Übung frei, um Ressourcenbereinigung zu üben