在Visual Studio中,当我输入“Implements IDisposable”行时,IDE会自动添加:

  • 一个disposedValue成员变量
  • 一个Sub Dispose() Implements IDisposable.Dispose
  • 一个Sub Dispose(ByVal disposing As Boolean)
  • Dispose()应该保留不变,清理代码应该放在Dispose(disposing)中。

    但是Dispose Finalize Pattern说您还应该重写Sub Finalize()来调用Dispose(False)。为什么IDE也不添加此内容?我必须自己添加它,还是以某种方式隐式调用它?

    编辑:知道IDE为什么会自动添加80%的所需内容但不使用Finalize方法的想法吗?难道不是这种功能的全部目的就是要帮助您不要忘记这些东西吗?

    编辑2:谢谢大家的出色回答,现在这很有意义!

    最佳答案

    如果您实际上持有的非托管资源不会被垃圾收集器自动清理,而是在Dispose()中清理这些资源,那么可以,您应该在Finalize()中执行相同的操作。

    如果由于其他原因要实现IDisposable,则不需要实现Finalize()。

    基本问题是这样的:如果未调用Dispose()并收集了对象垃圾,会发生内存泄漏吗?如果是,请执行Finalize。如果不是,则不需要。另外,避免“仅仅因为它更安全”而实现Finalize。具有自定义终结器的对象可能需要两次GC释放才能释放它们-一次将它们放入待定终结器队列中,而第二次则实际上释放它们的内存。

    关于VB.NET-在实现IDisposable时是否应该添加Finalize方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/113267/

    10-12 00:28
    查看更多