Top / .NET備忘録 / 99.小ネタ / 12.IDisposable

Visual Studio のエディタ上で

 	Implements IDisposable

を記述して Enter キーを押すと

#Region "IDisposable Support"
    Private disposedValue As Boolean ' 重複する呼び出しを検出するには

    ' IDisposable
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: マネージ状態を破棄します (マネージ オブジェクト)。
            End If

            ' TODO: アンマネージ リソース (アンマネージ オブジェクト) を解放し、下の Finalize() をオーバーライドします。
            ' TODO: 大きなフィールドを null に設定します。
        End If
        Me.disposedValue = True
    End Sub

    ' TODO: 上の Dispose(ByVal disposing As Boolean) にアンマネージ リソースを解放するコードがある場合にのみ、Finalize() をオーバーライドします。
    'Protected Overrides Sub Finalize()
    '    ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(disposing As Boolean) に記述します。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

のようなロジックが生成されますが、どうにも気に入りません。

このクラスを継承し、継承先で Dispose をオーバーライドしようとすると、重複呼び出しを防ぐ処理を、また書かなくてはなりません。

    Private disposedValue As Boolean ' 重複する呼び出しを検出するには

    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            Me.disposedValue = True '再帰呼び出し対策のため先に代入
            DisposeOnlyOnce(disposing)
        End If
    End Sub

    Protected Overridable Sub DisposeOnlyOnce(disposing As Boolean)
        If disposing Then
            ' TODO: マネージ状態を破棄します (マネージ オブジェクト)。
        End If
        ' TODO: アンマネージ リソース (アンマネージ オブジェクト) を解放し、下の Finalize() をオーバーライドします。
        ' TODO: 大きなフィールドを null に設定します。
    End Sub

こんな感じにしておいて、継承先では DisposeOnlyOnce をオーバーライドするようにしたらどうでしょうか。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2016-03-03 (木) 16:48:51 (652d)