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