我一直在听到有关在终结器和 Dispose() 方法中放置代码来处理非托管资源的建议。我不明白的是,由于在 GC 发生时会调用终结器,所以我们可以从技术上假设它一直被调用。在那种情况下,为什么还要麻烦处理一个对象?我错过了什么吗?
问问题
247 次
2 回答
10
在那种情况下,为什么还要麻烦处理一个对象?
因为您无法控制终结器何时运行。很可能是 GC 运行频率太低,并且仅依赖终结器的程序可能会因缺乏资源(文件句柄、数据库连接)而崩溃。
最佳实践(一次性模式)使用终结器作为备份计划,终结器的执行通常被认为是需要修复的错误。
于 2013-11-11T09:33:21.843 回答
2
引用 MSDN http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
尽管终结器在某些清理场景中很有效,但它们有两个明显的缺点:
当 GC 检测到对象符合收集条件时,将调用终结器。这发生在不再需要资源后的某个未确定的时间段内。开发人员可以或想要释放资源的时间与终结器实际释放资源的时间之间的延迟在获取许多稀缺资源(容易耗尽的资源)的程序中或在资源不足的情况下可能是不可接受的。保持使用成本很高(例如,大型非托管内存缓冲区)。
当 CLR 需要调用终结器时,它必须将对象内存的收集推迟到下一轮垃圾收集(终结器在收集之间运行)。这意味着对象的内存(以及它所引用的所有对象)将在更长的时间内不会被释放。
于 2013-11-11T09:35:45.520 回答