在Visual Studio,当我式的线"Implements IDisposable",IDE自动增加了:

  • 一个 disposedValue 成员可变
  • 一个 Sub Dispose() Implements IDisposable.Dispose
  • 一个 Sub Dispose(ByVal disposing As Boolean)

Dispose() 应该单独留在家中,以及清洁起码应该把 Dispose(disposing).

但是的 处置完成的图案 说你也应该复盖 Sub Finalize()Dispose(False).为什么不IDE也加入这个吗?我必须增加它自己,或是以某种方式称为隐含?

编辑: 任何知道为什么IDE自动增加了80%的必需的东西,但叶出的最后确定方法吗?不是这种特性来帮助你 忘掉这些东西?

EDIT2: 感谢你们良好的答案,现在这个非常有意义!

有帮助吗?

解决方案

如果你实际上是保持非管理资源,将不会自动清除的垃圾回收和清理那些在你的Dispose(),然后是的,你应该这样做在最终确定().

如果你执行IDisposable其他一些原因,实施最后确定()不是必需的。

基本的问题是这个:如果Dispose()不是叫你的对象垃圾收集,将存储器泄漏?如果是,实现完成。如果不,你不需要。此外,应避免实施最终确定"只是因为它的更安全"。对象定义的终结器可能需要两GC传递到他们自由--一旦把它们放在待终结器的队列,第二通行证,实际上是免费他们的记忆。

其他提示

不,你不需要最终确定,除非你已经不受管理的资源以清理。

在大多数情况下的原因,一类是一次性的是因为它不断提到的其他管理IDisposable的对象。在这种情况下,没有最后确定方法是必要的或可取的。

Implements IDisposable

Public Overloads Sub Dispose() Implements IDisposable.Dispose

    Dispose(True)
    GC.SuppressFinalize(Me)

End Sub

Protected Overloads Sub Dispose(ByVal disposing As Boolean)

    If disposing Then
        ' Free other state (managed objects).
    End If
    ' Free your own state (unmanaged objects).
    ' Set large fields to null.
End Sub

Protected Overrides Sub Finalize()

    Dispose(False)
    MyBase.Finalize()

End Sub

正如其他人已经说过,你不需要实行一个终结,除非你直接持有不受管理的资源。此外,假设你的工作。网2.0或更高,这是不可能,你永远需要实行一个终结,因为通常SafeHandle可以用来换你的不受管理的资源。

我写了一个 相当长的篇博客 复盖的背景和执行情况的IDisposable和终结器,这可能是值得一读如果您不完全清楚。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top