我有一个带终结器的课程.但是因为我总是调用Dispose()而Dispose()正在调用GC.SupressFinalize(this),所以我认为我的对象实际上并没有进入终结队列.终结器只是在那里作为一个支持器,以防该类的另一个用户忘记调用Dispose().
即使从未调用终结器并且对象永远不会进入终结队列,是否会对实现终结器有任何性能损失?
我曾经不这么认为,但在Bill Wagner的Effective C#:Second Edition的第102页上,它说,“即使它从未被调用过,终结器的存在确实会给你的类型带来相当大的性能损失.”
最佳答案
Is there any performance penalty for just implementing a finalizer even if its never called and the object never makes it to the finalization queue?
只要你正确实现它,并在你的对象上调用GC.SuppressFinalize,只有当用户不调用Dispose()时才会出现“惩罚”.
话虽如此,在大多数情况下,“严重”的惩罚实际上并不是那么严重.如果你有许多短暂的对象,终结器会污染你的垃圾收集过程,那将是一个问题,但这很少是一个问题,因为具有终结器的对象很少(整体).