Die IDisposable-Schnittstelle ist zentral für das Aufräumen von Ressourcen und spielt in C# zwei wichtige Rollen:
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).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.
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.