Share via


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:

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

Referenz

IDisposable

Weitere Ressourcen

Garbage Collection