Verwenden von Konstruktoren und Destruktoren
Konstruktoren und Destruktoren steuern die Erstellung und Zerstörung von Objekten.
Zum Erstellen des Konstruktors für eine Klasse erstellen Sie an beliebiger Stelle in der Klassendefinition eine Prozedur mit der Bezeichnung Sub New. Zum Erstellen eines parametrisierten Konstruktors legen Sie die Namen und Datentypen der Argumente von Sub New genauso fest, als wenn Sie die Argumente für eine beliebige andere Prozedur angeben würden. Beispiel:
Sub New(ByVal s As String)
Konstruktoren sind häufig überladen (siehe folgenden Code):
Sub New(ByVal s As String, i As Integer)
Wenn Sie eine von einer anderen Klasse abgeleitete Klasse definieren, muss die erste Zeile eines Konstruktors einen Aufruf an den Konstruktor der Basisklasse beinhalten, sofern die Basisklasse nicht über einen zugreifbaren Konstruktor verfügt, der keine Parameter benötigt. Ein Aufruf an die Basisklasse mit dem oben stehenden Konstruktor wäre beispielsweise MyBase.New(s). Andernfalls ist MyBase.New optional und wird von der Visual Basic-Laufzeit implizit aufgerufen.
Nachdem Sie Code für den Aufruf des Konstruktors des übergeordneten Objekts geschrieben haben, können Sie der Sub New-Prozedur beliebigen zusätzlichen Initialisierungscode hinzufügen. Sub New kann beim Aufruf als parametrisierter Konstruktor Argumente akzeptieren. Diese Parameter werden von der den Konstruktor aufrufenden Prozedur, z. B. Dim AnObject As New ThisClass(X), übergeben.
Im folgenden Code wird die Verwendung von Dispose und Finalize zum Freigeben von Ressourcen in einer Basisklasse veranschaulicht.
Hinweis |
|---|
| Befolgen Sie die in Objektlebensdauer: Erstellen und Zerstören von Objekten beschriebenen Richtlinien zum Implementieren von IDisposable. |
' Design pattern for a base class.
Public Class Base
Implements IDisposable
' Keep track of when the object is disposed.
Protected disposed As Boolean = False
' This method disposes the base object's resources.
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
' Insert code to free unmanaged resources.
End If
' Insert code to free shared resources.
End If
Me.disposed = True
End Sub
#Region " IDisposable Support "
' Do not change or add Overridable to these methods.
' Put cleanup code in Dispose(ByVal disposing As Boolean).
Public 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
Im folgenden Code wird die Verwendung von Dispose und Finalize zum Freigeben von Ressourcen in einer abgeleiteten Klasse veranschaulicht.
' Design pattern for a derived class. Public Class Derived Inherits Base ' This method disposes the derived object's resources. Protected Overrides Sub Dispose(ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then ' Insert code to free unmanaged resources. End If ' Insert code to free shared resources. End If MyBase.Dispose(disposing) End Sub ' The derived class does not have a Finalize method ' or a Dispose method with parameters because it inherits ' them from the base class. End Class
Im folgenden Code wird ein allgemeines Entwurfsmuster für den Dispose-Destruktor unter Verwendung eines Using-Blocks und eines entsprechenden Try...Finally-Blocks veranschaulicht.
Sub DemonstrateUsing() Using d As New Derived ' Code to use the Derived object goes here. End Using End Sub Sub DemonstrateTry() Dim d As Derived = Nothing Try d = New Derived ' Code to use the Derived object goes here. Finally ' Call the Dispose method when done, even if there is an exception. If Not d Is Nothing Then d.Dispose() End If End Try End Sub
Im nächsten Beispiel wird ein Objekt mithilfe eines parametrisierten Konstruktors erstellt und anschließend der Destruktor aufgerufen, wenn das Objekt nicht mehr benötigt wird.
Hinweis |
|---|
| Obwohl in diesem Beispiel Collect verwendet wird, um zu veranschaulichen, welche Methoden der Garbage Collector zum Entfernen von Methoden verwendet, sollten Sie die Verwaltung der Garbage Collection im Allgemeinen durch die Common Language Runtime (CLR) ausführen lassen. |
Sub TestConstructorsAndDestructors() ' Demonstrate how the Using statement calls the Dispose method. Using AnObject As New ThisClass(6) ' Place statements here that use the object. MsgBox("The value of ThisProperty after being initialized " & _ " by the constructor is " & AnObject.ThisProperty & ".") End Using ' Demonstrate how the garbage collector calls the Finalize method. Dim AnObject2 As New ThisClass(6) AnObject2 = Nothing GC.Collect() End Sub Public Class BaseClass Sub New() MsgBox("BaseClass is initializing with Sub New.") End Sub Protected Overrides Sub Finalize() MsgBox("BaseClass is shutting down with Sub Finalize.") ' Place final cleanup tasks here. MyBase.Finalize() End Sub End Class Public Class ThisClass Inherits BaseClass Implements IDisposable Sub New(ByVal SomeValue As Integer) ' Call MyBase.New if this is a derived class. MyBase.New() MsgBox("ThisClass is initializing with Sub New.") ' Place initialization statements here. ThisPropertyValue = SomeValue End Sub Private ThisPropertyValue As Integer Property ThisProperty() As Integer Get CheckIfDisposed() ThisProperty = ThisPropertyValue End Get Set(ByVal Value As Integer) CheckIfDisposed() ThisPropertyValue = Value End Set End Property Protected Overrides Sub Finalize() MsgBox("ThisClass is shutting down with Sub Finalize.") Dispose(False) End Sub ' Do not add Overridable to this method. Public Overloads Sub Dispose() Implements IDisposable.Dispose MsgBox("ThisClass is shutting down with Sub Dispose.") Dispose(True) GC.SuppressFinalize(Me) End Sub Private disposed As Boolean = False Public Sub CheckIfDisposed() If Me.disposed Then Throw New ObjectDisposedException(Me.GetType().ToString, _ "This object has been disposed.") End If End Sub Protected Overridable Overloads Sub Dispose( _ ByVal disposing As Boolean) MsgBox("ThisClass is shutting down with the Sub Dispose overload.") ' Place final cleanup tasks here. If Not Me.disposed Then If disposing Then ' Dispose of any managed resources. End If ' Dispose of any unmanaged resource. ' Call MyBase.Finalize if this is a derived class, ' and the base class does not implement Dispose. MyBase.Finalize() End If Me.disposed = True End Sub End Class
Wenn Sie dieses Beispiel ausführen, ruft die ThisClass-Klasse den Sub New-Konstruktor der BaseClass-Klasse auf. Nachdem die Ausführung des Konstruktors in der Basisklasse beendet wurde, führt die ThisClass-Klasse die restlichen Anweisungen in Sub New aus, die einen Wert für die ThisProperty-Eigenschaft initialisieren.
Wenn die Klasse nicht mehr benötigt wird, wird in ThisClass der Dispose-Destruktor aufgerufen.
In diesem Beispiel wird Folgendes dargestellt:
BaseClass is initializing with Sub New.
ThisClass is initializing with Sub New.
The value of ThisProperty after being initialized by the constructor is 6.
ThisClass is shutting down with Sub Dispose.
ThisClass is shutting down with the Sub Dispose overload.
BaseClass is shutting down with Sub Finalize.
BaseClass is initializing with Sub New.
ThisClass is initializing with Sub New.
ThisClass is shutting down with Sub Finalize.
ThisClass is shutting down with the Sub Dispose overload.
BaseClass is shutting down with Sub Finalize.
Hinweis