VB.NET - 实现 IDisposable 时是否应该添加 Finalize 方法?

标签 vb.net dispose idisposable destructor finalize

在 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/

相关文章:

c# - 集合类和 IDisposable 接口(interface)

c# - 我负责处理 BackgroundImage 吗?

c# - 如何清理?

c# - 是否应该为 Process.GetCurrentProcess() 调用 Dispose?

c# - 从 Dispose() 触发事件是否可以?

正则表达式查找不是句子中第一个单词的专有名词或短语

javascript - MD5.ComputeHash(Encoding.Unicode.GetBytes(value)) 转换成 JavaScript

vb.net - 在vb.net中设置系统记录级别

vb.net - 我想在调用函数返回错误时控制错误消息

c# - Dispose,什么时候调用?