方法 : 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)」を参照してください。

コードのコンパイル方法

この例で必要な要素は次のとおりです。

コードには以下の変更を加える必要があります。

  • ResourceClass を、IDisposable を実装するクラスの名前に置き換えます。

  • 破棄される可能性のあるリソースを使用するすべてのメソッドで、AnyOtherMethods 内のテストを使用します。

  • managedResource 宣言を、破棄する必要があるクラス内でマネージ オブジェクトの宣言に置き換えます。IDisposable を実装するか Close メソッドを持つクラスは、多くの場合破棄する必要があります。Dispose メソッドでは、これらのオブジェクトを閉じるか破棄します。

  • unManagedResource 宣言を、破棄する必要があるクラス内でアンマネージ オブジェクトの宣言に置き換えます。これらのオブジェクトを破棄するために使用するメソッドは、オブジェクトの定義によって異なります。詳細については、オブジェクトに関するドキュメントを参照してください。

堅牢性の高いプログラム

Dispose メソッドを呼び出した後は、コレクションに含まれているオブジェクトは無効になります。オブジェクトになんらかの操作を実行する前に、disposed フィールドをテストする必要があります。具体的な方法については、コード例の AnyOtherMethods メソッドを参照してください。

参照

概念

Dispose メソッドの実装

参照

IDisposable

その他の技術情報

ガベージ コレクション