Usando Construtores e Destrutores
Construtores e destrutores controlam a criação e a destruição de objetos.
Construtores
Para criar um construtor para uma classe, crie um procedimento chamado Sub New em qualquer lugar na definição da classe.Para criar um construtor com parâmetros, especifique os nomes e tipos de dados dos argumentos para Sub New exatamente como você faria para qualquer outro procedimento, como no código a seguir:
Sub New(ByVal s As String)
Os construtores são frequentemente sobrecarregados, como no código a seguir:
Sub New(ByVal s As String, i As Integer)
Quando você define uma classe derivada de outra classe, a primeira linha de um construtor deve ser uma chamada para o construtor da classe base, a menos que a classe base tenha um construtor acessível que não recebe parâmetros.Uma chamada para a classe base que contém o construtor acima, por exemplo, seria MyBase.New(s).Caso contrário, MyBase.New é opcional, e o tempo de execução Visual Basic chama implicitamente.
Depois de escrever o código para chamar o construtor do objeto pai, você pode adicionar qualquer código de inicialização adicional ao Sub New procedimento. Sub New pode aceitar argumentos quando chamado sistema autônomo um construtor parametrizado. Esses parâmetros são passados do procedimento que está chamando o construtor, por exemplo, Dim AnObject As New ThisClass(X).
Destructors
O código a seguir mostra como usar Dispose e Finalize para liberar recursos em um classe base.
Observação: |
---|
Você deve seguir as diretrizes para implementação IDisposable definidos na Como objetos são criados e destruídos Outros recursos. |
' 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 managed resources.
End If
' Insert code to free unmanaged 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
O código a seguir mostra como usar Dispose e Finalize para liberar recursos em um classe base.
' 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 managed resources.
End If
' Insert code to free unmanaged 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
O código a seguir mostra um padrão de design comum para o destrutor Dispose , usando um bloco Using e um bloco Try...Finally equivalente.
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
O próximo exemplo cria um objeto usando um construtor com parâmetros e em seguida, chama destrutores quando o objeto não for mais necessário.
Observação: |
---|
Embora este exemplo usa Collect para demonstrar os métodos que o coletor de lixo chamar métodos, em geral, você deve descartar o common linguagem tempo de execução (CLR) permitem gerenciar coleta de lixo. |
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
Quando você executa esse exemplo, a classe ThisClass chama o construtor Sub New da classe BaseClass.Depois que o construtor da classe base finalizar, a classe ThisClass executa as instruções restantes em Sub New que inicializam um valor para a propriedade ThisProperty.
Quando a classe não for mais necessária, o destrutor Dispose é chamado em ThisClass.
Este exemplo ilustra o seguinte:
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.
Consulte também
Conceitos
Como objetos são criados e destruídos Outros recursos
Finalize métodos and Destructors
Como os métodos New e Finalizes trabalham em uma hierarquia de classes