Bereinigen von nicht verwalteten Ressourcen

Für die meisten von der App erstellten Objekte führt der Garbage Collector von .NET die Speicherverwaltung aus. Wenn Sie jedoch Objekte erstellen, die nicht verwaltete Ressourcen enthalten, müssen Sie diese Ressourcen explizit freigeben, wenn sie nicht mehr verwendet werden. Die geläufigsten Typen nicht verwalteter Ressourcen sind Objekte, die Betriebssystemressourcen umschließen, wie etwa Dateien, Fenster, Netzwerkverbindungen oder Datenbankverbindungen. Der Garbage Collector kann die Lebensdauer eines Objekts nachverfolgen, das eine nicht verwaltete Ressource kapselt, er kann jedoch die nicht verwaltete Ressource nicht freigeben und bereinigen.

Wenn Ihre Typen nicht verwaltete Ressourcen verwenden, gehen Sie wie folgt vor:

  • Implementieren Sie das Dispose-Muster. Hierfür müssen Sie eine IDisposable.Dispose-Implementierung bereitstellen, um die deterministische Freigabe nicht verwalteter Ressourcen zu ermöglichen. Ein Consumer Ihres Typs ruft Dispose auf, wenn das Objekt (und die Ressourcen, die es verwendet) nicht mehr benötigt wird. Die Dispose-Methode gibt die nicht verwalteten Ressourcen sofort frei.

  • Falls ein Consumer Ihres Typs vergisst, Dispose aufzurufen, sorgen Sie dafür, dass die nicht verwalteten Ressourcen freigegeben werden. Hierfür gibt es zwei Möglichkeiten:

    • Verwenden Sie ein SafeHandle, um die nicht verwaltete Ressource zu umschließen. Dies ist das empfohlene Verfahren. SafeHandles werden von der abstrakten System.Runtime.InteropServices.SafeHandle-Klasse abgeleitet und enthalten eine robuste Finalize-Methode. Wenn Sie ein SafeHandle verwenden, implementieren Sie einfach die IDisposable-Schnittstelle, und rufen Sie die Dispose-Methode des SafeHandle in der IDisposable.Dispose-Implementierung auf. Der Finalizer des SafeHandle wird automatisch vom Garbage Collector aufgerufen, wenn dessen Dispose-Methode nicht aufgerufen wird.

      oder

    • Definieren Sie einen Finalizer. Der Abschluss aktiviert die nicht deterministische Freigabe von nicht verwalteten Ressourcen, wenn der Consumer eines Typs IDisposable.Dispose nicht aufrufen kann, um sie deterministisch freizugeben.

      Warnung

      Der Objektabschluss kann ein komplexer und fehleranfälliger Vorgang sein, deshalb wird empfohlen, eine SafeHandle-Klasse zu verwenden, anstatt einen eigenen Finalizer bereitzustellen.

Consumer Ihres Typs können dann die IDisposable.Dispose-Implementierung direkt aufrufen, um Arbeitsspeicher freizugeben, der von nicht verwalteten Ressourcen verwendet wird. Wenn Sie eine Dispose-Methode ordnungsgemäß implementieren, stellt entweder die Finalize-Methode des SafeHandles oder Ihre eigene Überschreibung der Object.Finalize-Methode eine Absicherung zur Bereinigung der Ressourcen für den Fall dar, dass die Dispose-Methode nicht aufgerufen wird.

In diesem Abschnitt

Implementieren einer Dispose-Methode beschreibt, wie das Dispose-Muster für die Freigabe nicht verwalteter Ressourcen implementiert wird.

Verwenden von Objekten, die IDisposable implementierenIDisposable beschreibt, wie Consumer eines Typs sicherstellen, dass dessen Dispose-Implementierung aufgerufen wird. Sie sollten die using-Anweisung in C# (oder die Using-Anweisung in Visual Basic) verwenden, um dies durchzuführen.

Referenz

Typ/Member Beschreibung
System.IDisposable Definiert die Dispose-Methode zum Freigeben von nicht verwalteten Ressourcen.
Object.Finalize Ermöglicht den Objektabschluss, wenn nicht verwaltete Ressourcen nicht durch die Dispose-Methode freigegeben werden.
GC.SuppressFinalize Unterdrückt einen Abschluss. Diese Methode wird normalerweise von einer Dispose-Methode aufgerufen, um zu verhindern, dass ein Finalizer ausgeführt wird.