我有一个带终结器的课程。但是因为我总是在调用Dispose()
而Dispose()
正在调用GC.SupressFinalize(this)
,所以我认为我的对象实际上并没有进入终结队列。终结者只是在那里作为一个支持,以防该类的另一个用户忘记拨打Dispose()
。
即使从未调用终结器并且该对象永远不会进入终结队列,是否只会实现终结器的性能损失?
我曾经不这么认为,但在Bill Wagner的 Effective C#:Second Edition 的第102页上,它说,“即使它从未被调用过,终结器的存在确实引入了相当大的你的类型的性能损失。“
答案 0 :(得分:2)
即使从未调用终结器并且该对象永远不会进入终结队列,是否只会实现终结器的性能损失?
只要您正确实现此功能,并在对象上调用GC.SuppressFinalize
,只有在用户未拨打Dispose()
时才会出现“惩罚”。
话虽如此,在大多数情况下,“严厉”的惩罚实际上并不是那么严重。如果你有许多短暂的对象,终结器会污染你的垃圾收集过程,这将是一个问题,但这很少是一个问题,因为带有终结器的对象很少(整体)。
答案 1 :(得分:0)