VB.NET -应该最后确定方法以加入在实现IDisposable?
-
02-07-2019 - |
题
在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和终结器,这可能是值得一读如果您不完全清楚。