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

时间:2010-09-05 08:50:48

标签: .net garbage-collection dispose finalize

  

可能重复:
  Finalize vs Dispose

您好,

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

请分享......

提前致谢。

2 个答案:

答案 0 :(得分:17)

在回收eligible for collection的对象之前,垃圾收集会运行终结器。 Dispose()用于清理非托管资源,例如网络连接,文件,操作系统内容的句柄,等等。它最适合与using块一起使用,编译器确保在完成对象后立即调用Dispose() - 并且还确保一旦处理完对象就不能再使用该对象了

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

  

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

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

答案 1 :(得分:16)

  1. 结束:当没有更多对此实例的引用时,垃圾收集器会自动调用不确定非确定性destructor/finalizer
  2. Dispose:由开发人员确定性地调用实现IDisposable的对象来释放资源。