我的新客户位置中的代码审核核对表具有以下内容 -
实现Dispose和Finalize的类应该在Dispose实现中调用GC.SupressFinalize
为什么?
是否应该读取为实现IDisposable接口的类应该在Dispose实现中调用GC.SupressFinalize?
或者我错过了一些愚蠢的东西?
答案 0 :(得分:6)
你错过了这样一个事实,即不是每个一次性课程都需要一个终结者 - 事实上,很少有人这样做,particularly due to .NET 2.0's SafeHandle
type。如果没有终结器,为什么需要拨打SuppressFinalize
?
答案 1 :(得分:1)
这很准确。如果Dispose(bool)方法完成了它的工作,那么让终结器再次执行它就没有任何意义了。调用GC.SuppressFinalize()是一种优化,你可以阻止.NET打扰调用什么都不做的终结器。
我注意到你用大写字母C编写了Class。这暗示你是用VB.NET编写代码的。请注意,IDE在99.99%的情况下执行错误的事情。在输入“Implements IDisposable”后按Enter键,它会插入错误的代码:
Private disposedValue As Boolean = False ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: free other state (managed objects).
End If
' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
#Region " IDisposable Support "
' 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(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
呸。这是终结器的样板实现,在MSDN Library btw中有详细记载。这是不对的。实际上需要一个终结器是非常罕见的,.NET类已经自己处理它。如果您确实使用操作系统句柄,那么您应该使用SafeHandle派生类之一。或者编写自己的包装器。
将其编辑回来:
Public Sub Dispose() Implements IDisposable.Dispose
someField.Dispose()
'' maybe some more
''...
End Sub