我一直听到有关在终结器和Dispose()方法中放置代码来处理非托管资源的建议。我不明白的是,因为在GC发生时调用终结器所以我们可以在技术上假设它一直被调用。在那种情况下,为什么还要处理一个物体呢?我错过了什么吗?
答案 0 :(得分:10)
在那种情况下为什么还要处理一个物体呢?
因为终结器运行时无法控制。很可能GC过于频繁地运行,而单独依赖终结器的程序可能因资源不足(文件句柄,数据库连接)而崩溃。
最佳实践(一次性模式)使用终结器作为备份计划,通常执行终结器被认为是需要修复的错误。
答案 1 :(得分:2)
从MSDN引用 http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
虽然终结器在某些清理方案中是有效的,但它们有 两个显着的缺点:
GC时调用终结器 检测到对象符合收集条件。这发生在 在不需要资源之后的某个未确定的时间段 了。开发人员可能或希望之间的延迟 释放资源和实际资源的时间 终结者发布的程序可能是不可接受的 获得许多稀缺资源(可轻易耗尽的资源) 或者在资源使用成本高的情况下(例如,大的 非托管内存缓冲区。)
当CLR需要调用终结器时,它必须推迟收集 对象的内存直到下一轮垃圾收集( 终结者在集合之间运行)。这意味着对象的 内存(及其引用的所有对象)将不会被释放 更长的时间。