在.net中完成和处置有什么区别?

Hot*_*ter 15 .net garbage-collection dispose finalize

可能重复:
Finalize vs Dispose

嗨,

最近我在一次关于敲定和处置的采访中被问到了.何时使用它们以及垃圾收集器如何与它们相关.请分享链接,以更多地了解该主题.

请分享......

提前致谢.

Joe*_*oey 17

终结器由垃圾收集器运行,然后回收有资格收集的对象.Dispose()用于清理非托管资源,如网络连接,文件,OS操作句柄等.它最好与using块一起使用,编译器确保Dispose()在完成对象后立即调用它 - 并且还确保一旦处理完就不能再使用该对象.

需要注意的是终结不具有运行,因此依靠这可能是危险的:

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

还要注意物体有资格收集的准确时间.阅读上面链接的文章 - 它既不是范围(一个奇怪的词,它与对象的生命周期有关 - 它是"程序文本的区域,通过其不合格的名称引用[命名实体]是合法的. ")也不是严格的引用计数,因为即使在最后一次引用之前,一个对象也有资格收集.

  • 我想补充一点,应谨慎使用终结器。当您向对象添加终结器时,您会导致运行时保留该对象至少两个 GC 周期。此外,在终结器中,您不能保证对象的任何成员都没有被回收。因此访问它们可能会导致运行时异常。 (2认同)

Dar*_*rov 16

  1. 完成:当没有对此实例的更多引用时,垃圾收集器会自动调用不确定的非确定性析构函数/终结符.
  2. Dispose:由开发人员确定性地调用实现IDisposable以释放资源的对象.