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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

C# 中的“處置模式”:為什么我們需要“if(處置)”條件?

C# 中的“處置模式”:為什么我們需要“if(處置)”條件?

C#
慕妹3146593 2022-12-04 13:04:03
因此,默認(rèn)的處置模式實(shí)現(xiàn)如下所示:class SomeClass : IDisposable{   // Flag: Has Dispose already been called?   bool disposed = false;   // Public implementation of Dispose pattern callable by consumers.   public void Dispose()   {       Dispose(true);      GC.SuppressFinalize(this);              }   // Protected implementation of Dispose pattern.   protected virtual void Dispose(bool disposing)   {      if (disposed)         return;       if (disposing) {         // Free any other managed objects here.      }      // Free any unmanaged objects here.      disposed = true;   }   ~SomeClass()   {      Dispose(false);   }}據(jù)說:如果方法調(diào)用來自終結(jié)器(即,如果處置是 false),則僅執(zhí)行釋放非托管資源的代碼。由于未定義垃圾收集器在終結(jié)期間銷毀托管對(duì)象的順序,因此Dispose使用值調(diào)用此重載false可防止終結(jié)器嘗試釋放可能已被回收的托管資源。問題是:為什么假設(shè)被 object of 引用的對(duì)象SomeClass可能已經(jīng)被釋放,我們不應(yīng)該在從 finalizer 調(diào)用方法時(shí)嘗試釋放它們?如果那些對(duì)象仍然被我們的SomeClass對(duì)象引用,它們就不能被釋放,不是嗎?據(jù)說:那些有掛起(未運(yùn)行)終結(jié)器的(暫時(shí))保持活動(dòng)狀態(tài),并被放入一個(gè)特殊的隊(duì)列中。[...] 在每個(gè)對(duì)象的終結(jié)器運(yùn)行之前,它仍然非?;钴S——該隊(duì)列充當(dāng)根 對(duì)象。因此,我們的SomeClass對(duì)象再次被該隊(duì)列引用(這與被根引用相同)。對(duì)象引用的其他對(duì)象SomeClass也應(yīng)該是活動(dòng)的(因?yàn)樗鼈兪峭ㄟ^SomeClass對(duì)象生根的)。那么為什么以及如何在SomeClass調(diào)用終結(jié)器時(shí)釋放它們呢?
查看完整描述

2 回答

?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

Konrad Kokosa 在他的《Pro .NET Memory Management 》一書中有一個(gè)令人印象深刻的解釋。(強(qiáng)調(diào))

在 GC 期間,在標(biāo)記階段結(jié)束時(shí),GC 檢查終結(jié)隊(duì)列以查看是否有任何可終結(jié)對(duì)象已死亡。如果它們是一些,它們還不能被刪除,因?yàn)樗鼈兊慕K結(jié)器需要被執(zhí)行。因此,這樣的對(duì)象被移動(dòng)到另一個(gè)名為 fReachable queue 的隊(duì)列。它的名字來自于它代表最終化可達(dá)對(duì)象的事實(shí)——那些現(xiàn)在只因?yàn)樽罱K化才可達(dá)的對(duì)象。如果找到任何此類對(duì)象,GC 會(huì)向?qū)S媒K結(jié)器線程指示有工作要做。

終結(jié)線程是由 .NET 運(yùn)行時(shí)創(chuàng)建的另一個(gè)線程。它從 fReachable 隊(duì)列中一個(gè)一個(gè)地移除對(duì)象并調(diào)用它們的終結(jié)器。這發(fā)生在 GC 恢復(fù)托管線程之后,因?yàn)榻K結(jié)器代碼可能需要分配對(duì)象。由于此對(duì)象的唯一根已從 fReachable 隊(duì)列中刪除,下一次譴責(zé)此對(duì)象所在世代的 GC 將發(fā)現(xiàn)它不可訪問并回收它。

此外,fReachable 隊(duì)列在 Mark 階段被視為根,因?yàn)榻K結(jié)器線程可能不夠快,無(wú)法在 GC 之間處理來自它的所有對(duì)象。這使可終結(jié)對(duì)象更多地暴露于中年危機(jī)——它們可能會(huì)停留在 fReachable 隊(duì)列中一段時(shí)間,僅僅因?yàn)榈却K結(jié)而消耗第 2 代。

我認(rèn)為這里的關(guān)鍵是:

fReachable 隊(duì)列在 Mark 階段被視為根,因?yàn)榻K結(jié)器線程可能不夠快,無(wú)法在 GC 之間處理來自它的所有對(duì)象。


查看完整回答
反對(duì) 回復(fù) 2022-12-04
?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊

.NET 中的對(duì)象在存在對(duì)它們的任何引用時(shí)就存在。一旦最后一個(gè)引用不存在,它們就會(huì)不復(fù)存在。當(dāng)對(duì)象存在時(shí),對(duì)象使用的存儲(chǔ)將永遠(yuǎn)不會(huì)被回收,但是 GC 在回收存儲(chǔ)之前會(huì)做幾件事:

  1. 有一個(gè)特殊的列表,稱為“終結(jié)器隊(duì)列”,它包含對(duì)所有已注冊(cè)終結(jié)器的對(duì)象的引用。在識(shí)別出 Universe 中任何地方存在的所有其他引用之后,GC 將檢查終結(jié)器隊(duì)列中的所有對(duì)象,以查看是否找到了對(duì)它們的任何引用。如果此過程導(dǎo)致它找到以前未發(fā)現(xiàn)的對(duì)象,它會(huì)將引用復(fù)制到另一個(gè)稱為“freachable 隊(duì)列”的列表。任何時(shí)候 freachable 隊(duì)列非空并且沒有終結(jié)器正在運(yùn)行,系統(tǒng)將從該隊(duì)列中提取一個(gè)引用并調(diào)用終結(jié)器。

  2. GC 還將檢查所有弱引用的目標(biāo),并使目標(biāo)未被任何有效強(qiáng)引用識(shí)別的任何弱引用無(wú)效。

請(qǐng)注意,finalize 方法不會(huì)“垃圾收集”對(duì)象。相反,它會(huì)延長(zhǎng)對(duì)象的存在直到finalize被調(diào)用,目的是允許它履行對(duì)外部實(shí)體可能具有的任何義務(wù)。如果那時(shí)在宇宙中任何地方都不存在對(duì)該對(duì)象的引用,則該對(duì)象將不復(fù)存在。

請(qǐng)注意,兩個(gè)具有終結(jié)器的對(duì)象可能會(huì)相互引用。在這種情況下,它們的終結(jié)器運(yùn)行的順序是未指定的。


查看完整回答
反對(duì) 回復(fù) 2022-12-04
  • 2 回答
  • 0 關(guān)注
  • 124 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)