第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

垃圾收集器是否會為我調(diào)用IDisposable.Dispose?

垃圾收集器是否會為我調(diào)用IDisposable.Dispose?

手掌心 2019-08-06 16:10:13
垃圾收集器是否會為我調(diào)用IDisposable.Dispose?.NET IDisposable Pattern 意味著如果您編寫終結器并實現(xiàn)IDisposable,則終結器需要顯式調(diào)用Dispose。這是合乎邏輯的,而且在極少數(shù)情況下我總是會做終結器的保證。但是,如果我這樣做會發(fā)生什么:class Foo : IDisposable{      public void Dispose(){ CloseSomeHandle(); }}并且不要實現(xiàn)終結器或任何東西。框架會為我調(diào)用Dispose方法嗎?是的,我意識到這聽起來很愚蠢,而且所有的邏輯都暗示它不會,但我總是有兩件事讓我不確定。幾年前有人曾告訴我,事實上它會這樣做,而且那個人有“非常了解他們的東西”的良好記錄。編譯器/框架根據(jù)您實現(xiàn)的接口(例如:foreach,擴展方法,基于屬性的序列化等)執(zhí)行其他“神奇”操作,因此這也可能是“魔術”。雖然我已經(jīng)閱讀了很多關于它的內(nèi)容,并且有很多暗示的內(nèi)容,但我從來沒有能夠找到這個問題的肯定是或否答案。
查看完整描述

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來盡可能地清理資源,并認真嘗試找到使用終結器的方法。這符合您的應用程序的最佳利益。


查看完整回答
反對 回復 2019-08-06
  • 3 回答
  • 0 關注
  • 527 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號