Gewusst wie: Implementieren des Dispose-Finalize-Musters (Visual Basic)
Aktualisiert: November 2007
Das Dispose-Finalize-Muster stellt sicher, dass Ressourcen freigegeben werden, wenn das Objekt nicht mehr benötigt wird.
Beispiel
Im folgenden Beispiel nutzt die ResourceClass-Klasse verwaltete und nicht verwaltete Ressourcen und gibt sie anschließend mithilfe des Dispose-Finalize-Musters ordnungsgemäß frei. Die Ressourcen und ihre Funktionen lauten:
Die Implementierung der Dispose-Methode, die Benutzern der Klasse das Freigeben von Klasseninstanzen ermöglicht. Diese Methode ruft Dispose(True) auf, um die Ressourcen des Objekts freizugeben, und ruft anschließend SuppressFinalize auf, um zu verhindern, dass der Finalisierungscode ein zweites Mal ausgeführt wird.
Die Überschreibung der Finalize-Basismethode, die dem Garbage Collector der Common Language Runtime (CLR) das Freigeben von Klasseninstanzen ermöglicht. Diese Methode ruft Dispose(False) auf, um die Ressourcen des Objekts freizugeben. Wenn Dispose bereits zuvor für das Objekt aufgerufen wurde, müssen Sie beachten, dass der entsprechende Aufruf von SuppressFinalize verhindert, dass der Garbage Collector die Finalize-Methode aufruft.
Die Überladung der Dispose-Methode, durch die die eigentliche Freigabe erfolgt. Sie akzeptiert den booleschen Parameter disposing, der angibt, ob im Code die Freigabe des Objekts initiiert wurde. Wenn Sie ein Objekt freigeben, müssen alle seine Ressourcen freigegeben werden. Wenn der CLR-Garbage Collector ein Objekt freigibt, müssen nur die nicht verwalteten Ressourcen freigegeben werden. Der Garbage Collector gibt die verwalteten Ressourcen automatisch frei, sofern erforderlich.
Weitere Informationen finden Sie unter Objektlebensdauer: Erstellen und Zerstören von Objekten.
Public Class ResourceClass
Implements IDisposable
Private managedResource As System.ComponentModel.Component
Private unmanagedResource As IntPtr
Protected disposed As Boolean = False
Public Sub New()
' Insert appropriate constructor code here.
End Sub
Protected Overridable Overloads Sub Dispose( _
ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
managedResource.Dispose()
End If
' Add code here to release the unmanaged resource.
unmanagedResource = IntPtr.Zero
' Note that this is not thread safe.
End If
Me.disposed = True
End Sub
Public Sub AnyOtherMethods()
If Me.disposed Then
Throw New ObjectDisposedException(Me.GetType().ToString, _
"This object has been disposed.")
End If
End Sub
#Region " IDisposable Support "
' Do not change or add Overridable to these methods.
' Put cleanup code in Dispose(ByVal disposing As Boolean).
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
#End Region
End Class
Dieses Codebeispiel ist auch als IntelliSense-Codeausschnitt verfügbar. Sie finden es in der Codeausschnittauswahl unter Programmiersprache Visual Basic. Weitere Informationen finden Sie unter Gewusst wie: Einfügen von Ausschnitten in den Code (Visual Basic).
Kompilieren des Codes
Für dieses Beispiel ist Folgendes erforderlich:
- Zugriff auf die Member des System-Namespaces und des System.ComponentModel-Namespaces. Fügen Sie eine Imports-Anweisung hinzu, wenn der Code keine vollqualifizierten Membernamen enthält. Weitere Informationen finden Sie unter Imports-Anweisung (.NET-Namespace und Typ).
Die folgenden Änderungen müssen im Code vorgenommen werden:
Ersetzen Sie ResourceClass durch den Namen der Klasse, die IDisposable implementiert.
Verwenden Sie den Test in AnyOtherMethods in allen Methoden, die Ressourcen verwenden, die möglicherweise freigegeben wurden.
Ersetzen Sie die managedResource-Deklaration durch die Deklarationen der verwalteten Objekte in der Klasse, die freigegeben werden müssen. Wenn eine Klasse IDisposable implementiert oder über eine Close-Methode verfügt, muss sie wahrscheinlich freigegeben werden. Schließen Sie diese Objekte in der Dispose-Methode, oder geben Sie sie in der Methode frei.
Ersetzen Sie die unManagedResource-Deklaration durch die Deklarationen der nicht verwalteten Objekte in der Klasse, die freigegeben werden müssen. Die Methode für die Freigabe dieser Objekte hängt davon ab, wie das jeweilige Objekt definiert ist. Ausführliche Informationen finden Sie in der Dokumentation des Objekts.
Robuste Programmierung
Sobald die Dispose-Methode aufgerufen wurde, sind Objekte in der Auflistung nicht gültig. Testen Sie das disposed-Feld, bevor Sie Operationen für das Objekt ausführen. Ein Beispiel finden Sie in der AnyOtherMethods-Methode im Codebeispiel.
Siehe auch
Konzepte
Implementieren einer Dispose-Methode