我在一些非常古老的代码中处理一堆类。许多实现了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)
吗?
答案 0 :(得分:0)
在大多数情况下,您确实可以跳过参数,因为您没有任何“真正的”处理。但是,想象一下你的班级是“域控制器+活动目录+网络服务器+调度程序”,所有这些都包含在一个可怕的神级中。你上课可能会被告知要一次又一次地处理啄木鸟的处理,没有参数,你没有任何方法跟踪'我已经处理过并且可以忽略这个额外的处理请求'
Hans Passant的评论很好地总结了这种情况。很多你所看到的是遗产,可能不再需要,但“20分钟前”这是必要的,自动化是一种祝福。