在 Visual Studio 中,当我键入“Implements IDisposable
”行时,IDE 会自动添加:
- 一个
disposeValue
成员变量 Sub Dispose() 实现 IDisposable.Dispose
- a
Sub Dispose(ByVal 处置为 bool 值)
Dispose()
应该保留,清理代码应该放在 Dispose(disusing)
中。
但是Dispose Finalize Pattern表示您还应该重写 Sub Finalize()
来调用 Dispose(False)
。为什么IDE不添加这个呢?我必须自己添加它,还是以某种方式隐式调用它?
编辑:知道为什么 IDE 会自动添加 80% 的必需内容但忽略 Finalize 方法吗?这种功能的全部意义不就是帮助您不忘记这些事情吗?
EDIT2:感谢大家的出色回答,这现在非常有意义!
最佳答案
如果您实际上持有垃圾收集器不会自动清理的非托管资源并在 Dispose() 中清理它们,那么是的,您应该在 Finalize() 中执行相同的操作。
如果您出于其他原因实现 IDisposable,则不需要实现 Finalize()。
基本问题是:如果没有调用 Dispose() 并且你的对象被垃圾回收,内存会泄漏吗?如果是,则执行Finalize。如果没有,则不需要。另外,避免“仅仅因为它更安全”而实现 Finalize。具有自定义终结器的对象可能需要两次 GC 传递来释放它们 - 一次将它们放入挂起的终结器队列,第二次传递实际释放其内存。
关于VB.NET - 实现 IDisposable 时是否应该添加 Finalize 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/113267/