Bereinigen von nicht verwalteten RessourcenCleaning Up Unmanaged Resources

Für die meisten von der App erstellten Objekte führt der Garbage Collector von .NET die Speicherverwaltung aus.For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. Wenn Sie jedoch Objekte erstellen, die nicht verwaltete Ressourcen enthalten, müssen Sie diese Ressourcen explizit freigeben, wenn diese nicht mehr von der App verwendet werden.However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. Die geläufigsten Typen von nicht verwalteten Ressourcen sind Objekte, die Betriebssystemressourcen umschließen, wie etwa Dateien, Fenster, Netzwerkverbindungen oder Datenbankverbindungen.The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. 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.Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

Wenn Ihre Typen nicht verwaltete Ressourcen verwenden, gehen Sie wie folgt vor:If your types use unmanaged resources, you should do the following:

  • Implementieren Sie das Dispose-Muster.Implement the dispose pattern. Hierfür müssen Sie eine IDisposable.Dispose-Implementierung bereitstellen, um die deterministische Freigabe von nicht verwalteten Ressourcen zu ermöglichen.This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. Ein Consumer Ihres Typs ruft Dispose auf, wenn das Objekt (und die Ressourcen, die es verwendet), nicht mehr benötigt wird.A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. Die Dispose-Methode gibt die nicht verwalteten Ressourcen sofort frei.The Dispose method immediately releases the unmanaged resources.

  • Sorgen Sie dafür, dass die nicht verwalteten Ressourcen freigegeben werden können, falls ein Consumer Ihres Typs vergisst, Dispose aufzurufen.Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. Hierfür gibt es zwei Möglichkeiten:There are two ways to do this:

    • Verwenden Sie ein SafeHandle, um die nicht verwaltete Ressource zu umschließen.Use a safe handle to wrap your unmanaged resource. Dies ist das empfohlene Verfahren.This is the recommended technique. SafeHandles werden von der System.Runtime.InteropServices.SafeHandle-Klasse abgeleitet und enthalten eine robuste Finalize-Methode.Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. 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.When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. Der Finalizer des SafeHandle wird automatisch vom Garbage Collector aufgerufen, wenn dessen Dispose-Methode nicht aufgerufen wird.The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      – oder –—or—

    • Überschreiben Sie die Object.Finalize-Methode.Override the Object.Finalize method. 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.Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. Da aber der Objektabschluss ein komplexer und fehleranfälliger Vorgang sein kann, wird empfohlen, ein SafeHandle zu verwenden, anstatt einen eigenen Finalizer bereitzustellen.However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

Consumer Ihres Typs können dann die IDisposable.Dispose-Implementierung direkt aufrufen, um Arbeitsspeicher freizugeben, der von nicht verwalteten Ressourcen verwendet wird.Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. 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.When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

In diesem AbschnittIn This Section

Implementieren einer Dispose-MethodeImplementing a Dispose Method
Beschreibt, wie das Dispose-Muster für die Freigabe von nicht verwalteten Ressourcen implementiert wird.Describes how to implement the dispose pattern for releasing unmanaged resources.

Verwenden von Objekten, die IDisposable implementierenUsing Objects That Implement IDisposable
Beschreibt, wie Consumer eines Typs sicherstellen, dass dessen Dispose-Implementierung aufgerufen wird.Describes how consumers of a type ensure that its Dispose implementation is called. Es wird empfohlen, die using-Anweisung in C# oder die Using-Anweisung in Visual Basic zu verwenden, um dies durchzuführen.We recommend using the C# using statement or the Visual Basic Using statement to do this.

VerweisReference

System.IDisposable
Definiert die Dispose-Methode zum Freigeben von nicht verwalteten Ressourcen.Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
Ermöglicht den Objektabschluss, wenn nicht verwaltete Ressourcen nicht durch die Dispose-Methode freigegeben werden.Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
Unterdrückt einen Abschluss.Suppresses finalization. Diese Methode wird normalerweise von einer Dispose-Methode aufgerufen, um zu verhindern, dass ein Finalizer ausgeführt wird.This method is customarily called from a Dispose method to prevent a finalizer from executing.