4

我有一个带有终结器的课程。但由于我一直在调用Dispose()并且Dispose()正在调用GC.SupressFinalize(this),我认为我的对象实际上从未进入终结队列。终结器只是在那里作为后盾,以防该类的另一个用户忘记调用Dispose().

即使从未调用终结器并且对象从未进入终结队列,仅实现终结器是否有任何性能损失?

我以前不这么认为,但是在 Bill Wagner 的Effective C#: Second Edition的第 102 页上,它说:“即使它从未被调用,终结器的存在确实会给你的类型带来相当大的性能损失。”

4

2 回答 2

2

即使从未调用终结器并且对象从未进入终结队列,仅实现终结器是否有任何性能损失?

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

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

于 2011-02-03T03:20:46.660 回答
0

IIRC,终结器的问题是带有它们的对象可以在额外的 gc 循环中存活。但是,这只适用于调用终结器的情况。这篇文章解释得很好:http ://anasoft.wordpress.com/2007/06/17/more-about-gc-dispose-and-finalize/

于 2011-02-03T05:05:22.700 回答