オブジェクトの破棄を保証する
スポンサーリンク
プログラム中で、アンマネージ リソースなどを扱う場合はリソースを解放する必要があります。破棄には 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
関連するリファレンス
準備中です。
