Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Für einen Großteil der von Ihrer App erstellten Objekte können Sie sich auf den .NET Garbage Collector verlassen, um die Speicherverwaltung zu verarbeiten. Wenn Sie jedoch Objekte erstellen, die nicht verwaltete Ressourcen enthalten, müssen Sie diese Ressourcen explizit freigeben, wenn Sie die Verwendung abgeschlossen haben. Die am häufigsten verwendeten Typen von nicht verwalteten Ressourcen sind Objekte, die Betriebssystemressourcen wie Dateien, Fenster, Netzwerkverbindungen oder Datenbankverbindungen umschließen. Obwohl der Garbage Collector die Lebensdauer eines Objekts nachverfolgen kann, das eine nicht verwaltete Ressource kapselt, weiß er nicht, wie die nicht verwaltete Ressource freigegeben und bereinigt wird.
Wenn Ihre Typen nicht verwaltete Ressourcen verwenden, sollten Sie die folgenden Schritte ausführen:
Implementieren Sie das Dispose-Muster. Dies erfordert, dass 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 sofort die nicht verwalteten Ressourcen frei.
Falls ein Verbraucher Ihrer Art vergisst, Dispose aufzurufen, sollten Sie eine Möglichkeit bereitstellen, um Ihre nicht verwalteten Ressourcen freizugeben. Sie können auf zwei Arten vorgehen:
Verwenden Sie ein sicheres Handle, um Ihre nicht verwaltete Ressource umzuschließen. Dies ist die empfohlene Technik. SafeHandles werden von der abstrakten System.Runtime.InteropServices.SafeHandle-Klasse abgeleitet und enthalten eine robuste Finalize-Methode. Wenn Sie ein sicheres Handle-Objekt verwenden, implementieren Sie einfach die IDisposable Schnittstelle und rufen die Methode Dispose des sicheren Handle-Objekts in Ihrer 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. Die Finalisierung ermöglicht die nicht deterministische Freigabe von nicht verwalteten Ressourcen, wenn der Verbraucher eines Typs es versäumt, IDisposable.Dispose aufzurufen, 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.
Verbraucher Ihres Typs können ihre IDisposable.Dispose Implementierung dann 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
Das Implementieren einer Dispose-Methode beschreibt, wie das Dispose-Muster zum Freigeben nicht verwalteter Ressourcen implementiert wird.
Verwenden von Objekten, die IDisposable
implementieren beschreibt, wie Nutzer eines Typs sicherstellen, dass die Dispose Implementierung aufgerufen wird. Es wird dringend empfohlen, dazu die C# using
-Anweisung (oder die Visual Basic Using
)-Anweisung zu verwenden.
Referenz
Typ/Mitglied | BESCHREIBUNG |
---|---|
System.IDisposable | Definiert die Dispose Methode zum Freigeben nicht verwalteter Ressourcen. |
Object.Finalize | Ermöglicht den Objektabschluss, wenn nicht verwaltete Ressourcen nicht durch die Dispose-Methode freigegeben werden. |
GC.SuppressFinalize | Unterdrückt die Finalisierung. Diese Methode wird benutzerdefiniert von einer Dispose Methode aufgerufen, um zu verhindern, dass ein Finalizer ausgeführt wird. |