我应该在IDisposable和Finalize上实现GC.SupressFinalize吗?

时间:2011-01-05 17:32:44

标签: .net garbage-collection idisposable finalizer suppressfinalize

我的新客户位置中的代码审核核对表具有以下内容 -

  

实现Dispose和Finalize的类应该在Dispose实现中调用GC.SupressFinalize

为什么?

是否应该读取为实现IDisposable接口的类应该在Dispose实现中调用GC.SupressFinalize?

或者我错过了一些愚蠢的东西?

2 个答案:

答案 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
相关问题