我真的需要实现Dispose(布尔)吗?

时间:2018-06-13 07:37:36

标签: c# .net vb.net

我在一些非常古老的代码中处理一堆类。许多实现了IDisposable接口和Dispose()方法。但是根据I have read,任何实施IDisposable的班级都应该始终实施Dispose(Boolean)

即使Visual Basic生成的代码帮助实现IDisposable也提示这一点(抱歉VB ..):

#Region "IDisposable Support"
    Private mDisposed As Boolean

    ' IDisposable
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not mDisposed Then
            If disposing Then
                ' TODO: dispose managed state (managed objects).
            End If

            ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
            ' TODO: set large fields to null.
        End If
        mDisposed = True
    End Sub

    ' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
    'Protected Overrides Sub Finalize()
    '    ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
        Dispose(True)
        ' TODO: uncomment the following line if Finalize() is overridden above.
        ' GC.SuppressFinalize(Me)
    End Sub
#End Region

它附带了Dispose(Boolean)Dispose()方法,而Finalize()方法则被注释,表明它是唯一可选的。

但令我感到困惑的是,如果我实现Finalize()方法,Dispose(Boolean)方法似乎已经过时,因为它总是会被调用disposing == true。根据我的理解,这将导致完全相同的执行逻辑,除了在堆栈顶部添加的方法。

我错过了什么或者我可以放弃Dispose(Boolean)吗?

1 个答案:

答案 0 :(得分:0)

在大多数情况下,您确实可以跳过参数,因为您没有任何“真正的”处理。但是,想象一下你的班级是“域控制器+活动目录+网络服务器+调度程序”,所有这些都包含在一个可怕的神级中。你上课可能会被告知要一次又一次地处理啄木鸟的处理,没有参数,你没有任何方法跟踪'我已经处理过并且可以忽略这个额外的处理请求'

Hans Passant的评论很好地总结了这种情况。很多你所看到的是遗产,可能不再需要,但“20分钟前”这是必要的,自动化是一种祝福。