2011-02-03 92 views
4

我有一个终结者的课。但因为我总是打电话Dispose()Dispose()打电话给GC.SupressFinalize(this),我认为我的对象从来没有真正进入最终化队列。终结者只是在那里作为支持,以防其他用户忘记拨打Dispose()终结者的性能惩罚如果从未叫

仅仅实现一个终结器,即使它从未被调用并且对象永远不会到达终止队列,是否有任何性能损失?

我以前并不认为,但在第102页的有效的C#:第二版由比尔瓦格纳,它说,“即使它从来没有被调用,终结者的存在确实会引入一个相当大的性能损失为您类型“。

回答

2

即使从未调用终结器,并且对象永远不会将其终止到终止队列,是否有任何性能损失?

只要你正确地实现这一点,在对象上调用GC.SuppressFinalize的“惩罚”只会在用户不调用Dispose()发生。

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

+2

即使带有Finalizer的对象很少,你也可能不会基于持有的引用GC对象的_lot_ ... – 2011-02-03 03:26:41