📒

VB基本まとめ~クラス(インスタンス・コンストラクタ・デストラクタ)編~

2022/12/11に公開

インスタンスとコンストラクタ

クラスを利用するには基本的にインスタンス(実態)の生成が必要になり、インスタンスの生成にはNew演算子を使用します。

New演算子でクラスのインスタンスを生成する際に実行されるのがNewメソッドで、このようにインスタンス生成時に自動的に実行されるメソッドの事をコンストラクタと言います。
コンストラクタでは主に初期化をおこないます。

'*** クラスの宣言
Private Class Data
    '*** Sub Newは無くとも可

End Class

'*** wk1 Is Nothing
'*** Newをしない場合、インスタンスは生成されない
Dim wk1 As Data
'*** wk1 IsNot Nothing
'*** Newした時点でインスタンスが生成される
wk1 = New Data

'*** 宣言と同時にインスタンスを生成することも可能
Dim wk2 As New Data

また、クラスのインスタンス生成に引数を設定することも可能です。

'*** クラスの宣言
Private Class Data
    ''' <summary>
    ''' 引数の無いコンストラクタ
    ''' </summary>
    Sub New()
        '*** 初期化処理を記述
    End Sub
    ''' <summary>
    ''' 引数ありのコンストラクタ
    ''' </summary>
    ''' <param name="value1"></param>
    Sub New(value1 As Integer)
        '*** 引数の無いコンストラクタ実施
        MyClass.New
    End Sub
    ''' <summary>
    ''' 引数が異なる複数のコンストラクタを定義可能
    ''' </summary>
    ''' <param name="value1"></param>
    ''' <param name="value2"></param>
    Sub New(value1 As Integer, value2 As Integer)
        MyClass.New(value1)
    End Sub
End Class

Dim wk1 As Data
Dim wk2 As Data
Dim wk3 As Data

'*** 引数無しでインスタンス生成
wk1 = New Data
'*** 引数付きでインスタンス生成
wk2 = New Data(1)
wk3 = New Data(1, 2)

デストラクタ

コンストラクタがクラスの生成じに実行されるのに対し、デストラクタはクラスのインスタンスが破棄される時に実行されます。

インスタンスの破棄ということでDisposeを思い浮かべるかもしれませんが、VB.NetでのデストラクタはFinalizeメソッドになります。ですが、明示的に分ける必要も無い為、一旦Disposeもデストラクタの一部と考えても差し支えないかと思っております。

DisposeとFinalizeの違いはDisposeはUsing等で明示的に呼び出すのに対し、FinalizeはGCで回収される時に実行されるという違いになります。
独自実装のクラスにDisposeやFinalizeを実装するにはIDisposableインターフェースを実装します。

'*** クラスの宣言
Public Class Data
    Implements IDisposable
    ''' <summary>
    ''' 引数の無いコンストラクタ
    ''' </summary>
    Sub New()
        '*** 初期化処理を記述
    End Sub

    ''' <summary>開放処理が実施済みかのフラグ</summary>
    Protected _disposed = False

    Public Overloads Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
    End Sub
    Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
        If Not _disposed Then
            If disposing Then
                '*** アンマネージリソースの開放

            End If
            '*** マネージドリソースの開放

        End If
        _disposed = True
    End Sub

    ''' <summary>
    ''' デストラクタ
    ''' </summary>
    Protected Overrides Sub Finalize()
        MyBase.Finalize()
        Dispose(False)
    End Sub
End Class

前記したようにDisposeとFinalizeの大きな違いは明示的に呼び出せるか否かになってきます(FinalizeもGC.Collectで間接的に呼べなくもないですが)。
その為、VB.Netで開放処理をする場合、Disposeを使用するのが一般的になります。

Discussion