如果从不调用终结器的性能惩罚

时间:2011-02-03 03:08:07

标签: c# .net garbage-collection finalizer

我有一个带终结器的课程。但是因为我总是在调用Dispose()Dispose()正在调用GC.SupressFinalize(this),所以我认为我的对象实际上并没有进入终结队列。终结者只是在那里作为一个支持,以防该类的另一个用户忘记拨打Dispose()

即使从未调用终结器并且该对象永远不会进入终结队列,是否只会实现终结器的性能损失?

我曾经不这么认为,但在Bill Wagner的 Effective C#:Second Edition 的第102页上,它说,“即使它从未被调用过,终结器的存在确实引入了相当大的你的类型的性能损失。“

2 个答案:

答案 0 :(得分:2)

  

即使从未调用终结器并且该对象永远不会进入终结队列,是否只会实现终结器的性能损失?

只要您正确实现此功能,并在对象上调用GC.SuppressFinalize,只有在用户未拨打Dispose()时才会出现“惩罚”。

话虽如此,在大多数情况下,“严厉”的惩罚实际上并不是那么严重。如果你有许多短暂的对象,终结器会污染你的垃圾收集过程,这将是一个问题,但这很少是一个问题,因为带有终结器的对象很少(整体)。

答案 1 :(得分:0)

IIRC,终结器的问题在于它们的物体能够在额外的gc循环中存活。但这仅适用于调用终结器的情况。本文解释得很好:http://anasoft.wordpress.com/2007/06/17/more-about-gc-dispose-and-finalize/