方法 : Dispose Finalize パターンを実装する (Visual Basic)
更新 : 2007 年 11 月
DisposeFinalize パターンは、オブジェクトが必要なくなった時点でリソースが確実に解放されるようにします。
使用例
以下に示すコード例の ResourceClass クラスは、マネージ リソースとアンマネージ リソースを利用した後で、DisposeFinalize パターンを使ってこれらのリソースを適切に破棄します。リソースと関数は、以下のとおりです。
Dispose メソッドの実装。これは、このクラスのユーザーがクラス インスタンスを破棄できるようにします。このメソッドは、オブジェクトのリソースを破棄するために Dispose(True) を呼び出した後で、終了コードが 2 回実行されるのを防ぐために SuppressFinalize を呼び出します。
基本 Finalize メソッドのオーバーライド。これは、共通言語ランタイム (CLR: Common Language Runtime) のガベージ コレクタがクラス インスタンスを破棄できるようにします。このメソッドは、オブジェクトのリソースを破棄するために Dispose(False) を呼び出します。オブジェクトに対して Dispose が以前に呼び出されていると、そこから呼び出される SuppressFinalize により、ガベージ コレクタが Finalize メソッドを呼び出せなくなることに注意してください。
Dispose メソッドのオーバーロード。これは、リソース破棄の処理を実行します。このメソッドは、disposing というブール値パラメータを受け取ります。この値は、オブジェクトの破棄が開始されたかどうかを示します。オブジェクトを破棄するときは、オブジェクトのすべてのリソースを破棄する必要があります。CLR のガベージ コレクタがオブジェクトを破棄するときには、アンマネージ リソースだけが破棄されます。ガベージ コレクタでは、マネージ リソースの破棄は必要な時点で自動的に実行されます。
詳細については、「オブジェクトの有効期間 : オブジェクトの作成と破棄」を参照してください。
Public Class ResourceClass
Implements IDisposable
Private managedResource As System.ComponentModel.Component
Private unmanagedResource As IntPtr
Protected disposed As Boolean = False
Public Sub New()
' Insert appropriate constructor code here.
End Sub
Protected Overridable Overloads Sub Dispose( _
ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
managedResource.Dispose()
End If
' Add code here to release the unmanaged resource.
unmanagedResource = IntPtr.Zero
' Note that this is not thread safe.
End If
Me.disposed = True
End Sub
Public Sub AnyOtherMethods()
If Me.disposed Then
Throw New ObjectDisposedException(Me.GetType().ToString, _
"This object has been disposed.")
End If
End Sub
#Region " IDisposable Support "
' Do not change or add Overridable to these methods.
' Put cleanup code in Dispose(ByVal disposing As Boolean).
Public Overloads 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
このコードの例は、IntelliSense コード スニペットとしても利用できます。コード スニペット ピッカーでは、これは [Visual Basic Language] にあります。詳細については、「方法 : コードにスニペットを挿入する (Visual Basic)」を参照してください。
コードのコンパイル方法
この例で必要な要素は次のとおりです。
- System 名前空間および System.ComponentModel 名前空間のメンバへのアクセス。コード内でメンバ名を完全に修飾していない場合は、Imports ステートメントを追加します。詳細については、「Imports ステートメント (.NET 名前空間および型)」を参照してください。
コードには以下の変更を加える必要があります。
ResourceClass を、IDisposable を実装するクラスの名前に置き換えます。
破棄される可能性のあるリソースを使用するすべてのメソッドで、AnyOtherMethods 内のテストを使用します。
managedResource 宣言を、破棄する必要があるクラス内でマネージ オブジェクトの宣言に置き換えます。IDisposable を実装するか Close メソッドを持つクラスは、多くの場合破棄する必要があります。Dispose メソッドでは、これらのオブジェクトを閉じるか破棄します。
unManagedResource 宣言を、破棄する必要があるクラス内でアンマネージ オブジェクトの宣言に置き換えます。これらのオブジェクトを破棄するために使用するメソッドは、オブジェクトの定義によって異なります。詳細については、オブジェクトに関するドキュメントを参照してください。
堅牢性の高いプログラム
Dispose メソッドを呼び出した後は、コレクションに含まれているオブジェクトは無効になります。オブジェクトになんらかの操作を実行する前に、disposed フィールドをテストする必要があります。具体的な方法については、コード例の AnyOtherMethods メソッドを参照してください。