3 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
我想強調(diào)Brian在評論中的觀點,因為它很重要。
終結器不是像C ++那樣的確定性析構函數(shù)。正如其他人所指出的那樣,沒有什么時候會被稱為保證,而事實上,如果你有足夠的內(nèi)存,如果將永遠被調(diào)用。
但是關于終結器的壞處是,正如Brian所說,它會使你的對象在垃圾收集中存活下來。這可能很糟糕。為什么?
正如您可能知道或不知道的那樣,GC分為幾代 - Gen 0,1和2,以及大對象堆。Split是一個松散的術語 - 你得到一塊內(nèi)存,但是有一些指向Gen 0對象的起點和終點。
思考過程是你可能會使用很多短暫的物體。因此,對于GC來說,這些應該是簡單快速的 - Gen 0對象。因此,當存在內(nèi)存壓力時,它首先做的是Gen 0集合。
現(xiàn)在,如果它沒有解決足夠的壓力,那么它會返回并進行第1代掃描(重做第0代),然后如果仍然不夠,則執(zhí)行第2代掃描(重做第1代和第0代)。因此,清理長壽命對象可能需要一段時間并且相當昂貴(因為您的線程可能在操作期間被掛起)。
這意味著,如果您執(zhí)行以下操作:
~MyClass() { }
無論如何,您的對象都將存在于第2代。這是因為GC無法在垃圾回收期間調(diào)用終結器。所以必須最終確定的對象被移動到一個特殊的隊列,由另一個線程清理掉(終結器線程 - 如果你殺了它就會發(fā)生各種壞事)。這意味著您的對象會更長時間地掛起,并可能會強制更多垃圾收集。
所以,所有這一切只是為了讓你想要使用IDisposable來盡可能地清理資源,并認真嘗試找到使用終結器的方法。這符合您的應用程序的最佳利益。
- 3 回答
- 0 關注
- 527 瀏覽
添加回答
舉報