VB.NETオブジェクトの破棄を保証する

スポンサーリンク

プログラム中で、アンマネージ リソースなどを扱う場合はリソースを解放する必要があります。破棄には Dispose メソッド、Close メソッドがある場合は Close メソッドを使用します。必要なくなった時点で破棄すれば良いわけですが、何らかの原因で例外が発生した場合を考えると安易に実装できません。ここでは、オブジェクトの破棄を保証するための方法を紹介します。

サンプルコード

以下にサンプルコードを示します。

最初に Dispose メソッドだけが用意されている場合の例です。VB.NET では VB2005 から Using ステートメントが実装できるようになりますが、VB2003 までは Try ~ Finally を使用して保証します。

VB.NET 全般
    ' ブロックの外で変数を宣言する
    Dim cForm1 As Form1

    ' cForm1 が破棄されることを保証するために Try ~ Finally を使用する
    Try
        cForm1 = New Form1()
        cForm1.ShowDialog()
    Finally
        ' cForm1 を破棄する
        If Not cForm1 Is Nothing Then
            cForm1.Dispose()
        End If
    End Try

次に Connection 系などに多い、Close メソッド、Dispose メソッドの双方が実装されている場合の例です。Open メソッドに対して Close メソッドがあるため、Open メソッドの後で Finally を実装することになります。もちろん、Connection 以外に Command、DataAdapter、DataReader などを使用した場合は中でネストすることになります。(ここでは説明を省いています) VB.NET では、Try ~ Finally の 2 段構えになります。

VB.NET 全般
    ' ブロックの外で変数を宣言する
    Dim cSqlConnection As System.Data.SqlClient.SqlConnection

    ' cSqlConnection が破棄されることを保証するために Try ~ Finally を使用する
    Try
        cSqlConnection = New System.Data.SqlClient.SqlConnection("...省略...")
        cSqlConnection.Open()

        ' cSqlConnection が閉じられることを保証するために Try ~ Finally を使用する
        Try
            '
            ' ここで cSqlConnection を使用する
            '
        Finally
            ' cSqlConnection を閉じる
            If Not cSqlConnection Is Nothing Then
                cSqlConnection.Close()
            End If
        End Try
    Finally
        ' cSqlConnection を破棄する
        If Not cSqlConnection Is Nothing Then
            cSqlConnection.Dispose()
        End If
    End Try

次に Stream 系などに多い、Close メソッド、Dispose メソッドの双方が実装されているものの、Dispose メソッドが Protected などで隠蔽化されている場合の例です。VB2003 の場合は Using ステートメントがサポートされていないため、以下のように System.IDisposable インターフェイスから隠蔽化された Dispose メソッドを呼び出します。

VB.NET 全般
    ' ブロックの外で変数を宣言する
    Dim cReader As System.IO.StreamReader

    ' cReader が破棄されることを保証するために Try ~ Finally を使用する
    Try
        cReader = New System.IO.StreamReader("C:\Hoge.txt", System.Text.Encoding.Default)

        ' cReader が閉じられることを保証するために Try ~ Finally を使用する
        Try
            '
            ' ここで cReader を使用する
            '
        Finally
            ' cReader を閉じる
            If Not cReader Is Nothing Then
                cReader.Close()
            End If
        End Try
    Finally
        ' cReader を破棄する
        If Not cReader Is Nothing Then
            ' Dispose メソッドが隠蔽化されているため IDisposable から呼び出す
            Dim cDisposable As IDisposable = cReader
            cDisposable.Dispose()
        End If
    End Try

関連するリファレンス

準備中です。

スポンサーリンク