C#为什么在我们已经有终结器时进行处理

时间:2013-11-11 09:31:54

标签: c# garbage-collection finalizer

我一直听到有关在终结器和Dispose()方法中放置代码来处理非托管资源的建议。我不明白的是,因为在GC发生时调用终结器所以我们可以在技术上假设它一直被调用。在那种情况下,为什么还要处理一个物体呢?我错过了什么吗?

2 个答案:

答案 0 :(得分:10)

  

在那种情况下为什么还要处理一个物体呢?

因为终结器运行时无法控制。很可能GC过于频繁地运行,而单独依赖终结器的程序可能因资源不足(文件句柄,数据库连接)而崩溃。

最佳实践(一次性模式)使用终结器作为备份计划,通常执行终结器被认为是需要修复的错误。

答案 1 :(得分:2)

从MSDN引用 http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx

  

虽然终结器在某些清理方案中是有效的,但它们有   两个显着的缺点:

     
      
  • GC时调用终结器   检测到对象符合收集条件。这发生在   在不需要资源之后的某个未确定的时间段   了。开发人员可能或希望之间的延迟   释放资源和实际资源的时间   终结者发布的程序可能是不可接受的   获得许多稀缺资源(可轻易耗尽的资源)   或者在资源使用成本高的情况下(例如,大的   非托管内存缓冲区。)

  •   
  • 当CLR需要调用终结器时,它必须推迟收集   对象的内存直到下一轮垃圾收集(   终结者在集合之间运行)。这意味着对象的   内存(及其引用的所有对象)将不会被释放   更长的时间。

  •