可能重复:
Finalize vs Dispose
您好,
最近,我在一次关于敲定和处置的采访中被问到了。何时使用它们以及垃圾收集器如何与它们相关。请分享链接以更多地了解该主题。
请分享......
提前致谢。
答案 0 :(得分:17)
在回收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.”)也不是严格的引用计数,因为一个对象甚至可以在最后一个之前有资格收集对它的引用消失了。
答案 1 :(得分:16)