2011-02-03 71 views
4

我有一個終結者的課。但因爲我總是打電話Dispose()Dispose()打電話給GC.SupressFinalize(this),我認爲我的對象從來沒有真正進入最終化隊列。終結者只是在那裏作爲支持,以防其他用戶忘記撥打Dispose()終結者的性能懲罰如果從未叫

僅僅實現一個終結器,即使它從未被調用並且對象永遠不會到達終止隊列,是否有任何性能損失?

我以前並不認爲,但在第102頁的有效的C#:第二版由比爾瓦格納,它說,「即使它從來沒有被調用,終結者的存在確實會引入一個相當大的性能損失爲您類型「。

回答

2

即使從未調用終結器,並且對象永遠不會將其終止到終止隊列,是否有任何性能損失?

只要你正確地實現這一點,在對象上調用GC.SuppressFinalize的「懲罰」只會在用戶不調用Dispose()發生。

也就是說,在大多數情況下,「嚴重」的懲罰實際上並不是那麼嚴重。如果你有很多短命的對象,終結器會污染你的垃圾收集過程,那將是一個問題,但這很少是一個問題,因爲帶終結器的對象很少(總體)。

+2

即使帶有Finalizer的對象很少,你也可能不會基於持有的引用GC對象的_lot_ ... – 2011-02-03 03:26:41