【问题标题】:What is the difference between finalize and dispose in .net? [duplicate].net 中的 finalize 和 dispose 有什么区别? [复制]
【发布时间】:2011-04-08 09:56:05
【问题描述】:

可能重复:
Finalize vs Dispose

嗨,

最近,我在一次采访中被问及有关 finalize 和 dispose 的问题。何时使用它们中的每一个以及垃圾收集器与它们的关系。请分享链接以启发有关该主题的更多信息。

欢迎分享...

提前致谢。

【问题讨论】:

  • 你当时没有得到工作机会?任何有关 C# 或 CLR 的书都包含它。
  • 我回答了这个问题,但是当面试官问我们明确实施 Dispose 时会发生什么,GC 的作用是什么以及 Finalize 站在哪里时,让我感到困惑的是什么?

标签: .net garbage-collection dispose finalize


【解决方案1】:

垃圾回收器在回收eligible for collection 的对象之前运行终结器。 Dispose() 用于清理非托管资源,例如网络连接、文件、操作系统内容的句柄等。它与using 块结合使用效果最佳,编译器确保在您处理完一个对象后立即调用Dispose() - 并确保您在处理该对象后无法再使用它。

请注意finalizers don't have to run,因此依赖它可能很危险:

这对您意味着什么:您的程序不能依赖终结器来保持整洁。终结器是一个安全网,而不是资源回收的主要手段。当您使用完一个资源后,您需要通过调用Close 或Disconnect 或对象上可用的任何清理方法来释放它。 (IDisposable 接口编码了这个约定。)

还要注意对象符合收集条件的准确时间。阅读上面链接的文章——它既不是作用域(一个与对象的生命周期有关的奇怪词——它是“the region of program text in which it is legal to refer to [a named entity] by its unqualified name.”),也不是严格的引用计数,因为即使在最后一次引用之前,对象也可以被收集它消失了。

【讨论】:

  • 我想补充一点,应该小心使用终结器。当您向对象添加终结器时,您会导致运行时将对象保留至少两个 GC 周期。此外,在终结器内部,您不能保证对象的任何成员都没有被回收。所以访问它们可能会导致运行时异常。
【解决方案2】:
  1. 完成:undeterministic nondeterministic destructor/finalizer 在不再引用此实例时由垃圾收集器自动调用。
  2. Dispose:由开发人员在实现IDisposable 的对象上确定性地调用以释放资源。

【讨论】:

  • 我认为“非确定性”在这里是正确的词。
  • @Steven,我的英语很差。感谢您指出这一点。
  • 那么如果开发者实现了 IDisposable 那么 Finalize 仍然会被 GC 调用吗?
  • 是的,当对象超出范围并且 CLR 决定是执行 GC 的好时机时它会。
  • 不,您的英语完全可以理解。我只是对正确的词很挑剔。
猜你喜欢
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多