av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

.NET清理非托管資源

  • Dispose

類型的 Dispose 方法應(yīng)釋放它擁有的所有資源。它還應(yīng)該通過(guò)調(diào)用其父類型的 Dispose 方法釋放其基類型擁有的所有資源。該父類型的 Dispose 方法應(yīng)該釋放它擁有的所有資源并同樣也調(diào)用其父類型的 Dispose 方法,從而在整個(gè)基類型層次結(jié)構(gòu)中傳播此模式。若要確保始終正確地清理資源,Dispose 方法應(yīng)該可以被多次調(diào)用而不引發(fā)任何異常。Dispose 方法應(yīng)該為它處置的對(duì)象調(diào)用 GC.SuppressFinalize 方法。如果對(duì)象當(dāng)前在終止隊(duì)列中,GC.SuppressFinalize 防止其 Finalize 方法被調(diào)用。請(qǐng)記住,執(zhí)行 Finalize 方法會(huì)大大減損性能。如果您的 Dispose 方法已經(jīng)完成了清理對(duì)象的工作,那么垃圾回收器就不必再調(diào)用對(duì)象的 Finalize 方法。

成都創(chuàng)新互聯(lián)公司專注于赤峰林西網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供赤峰林西營(yíng)銷型網(wǎng)站建設(shè),赤峰林西網(wǎng)站制作、赤峰林西網(wǎng)頁(yè)設(shè)計(jì)、赤峰林西網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造赤峰林西網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供赤峰林西網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

  • 設(shè)計(jì)原則

     應(yīng)用程序或類庫(kù)應(yīng)只允許一個(gè)線程擁有資源的生存期,并且應(yīng)在不再需要資源時(shí)調(diào)用 Dispose。根據(jù)資源的不同,在處置資源時(shí)進(jìn)行異步線程訪問(wèn)可能會(huì)帶來(lái)安全風(fēng)險(xiǎn)。開(kāi)發(fā)人員應(yīng)仔細(xì)檢查自己的代碼,以確定最佳的方法來(lái)強(qiáng)制線程安全。

  • 代碼示例
 
 
 
  1. public class BaseResource: IDisposable 
  2.   // 非托管資源   private IntPtr handle; 
  3.   // 托管資源   private Component Components; 
  4.    // 對(duì)象是否已被釋放的標(biāo)志   private bool disposed = false; 
  5.  
  6.    public BaseResource()   {   } 
  7.  
  8.    // 釋放資源,對(duì)外開(kāi)放的可調(diào)用的方法 
  9.    public void Dispose() 
  10.    { 
  11.      // 釋放資源      Dispose(true); 
  12.      // 指示在析構(gòu)函數(shù)中跳過(guò)垃圾回收      GC.SuppressFinalize(this); 
  13.    } 
  14.  
  15.    // 釋放資源,如果disposing為true,釋放所有的托管資源和非托管資源,如果為false,則僅僅釋放非托管資源,這主要是為了避免在析構(gòu)函數(shù)中重復(fù)2次進(jìn)行垃圾回收 
  16.    protected virtual void Dispose(bool disposing) 
  17.    { 
  18.       // 檢查該對(duì)象是否已經(jīng)被釋放了 
  19.       if(!this.disposed) 
  20.       { 
  21.          if(disposing) 
  22.          { 
  23.            // 釋放托管資源            Components.Dispose(); 
  24.          } 
  25.         // 釋放非托管資源         CloseHandle(handle); 
  26.          handle = IntPtr.Zero; 
  27.       } 
  28.      // 標(biāo)記該對(duì)象為已被釋放的對(duì)象      disposed = true;          
  29.    } 
  30.  
  31.    // 析構(gòu)函數(shù),又名終結(jié)器 
  32.    ~BaseResource()       
  33.    { 
  34.       // 釋放非托管資源,在調(diào)用終結(jié)器方法時(shí)系統(tǒng)自動(dòng)會(huì)對(duì)托管的資源進(jìn)行垃圾回收 
  35.       Dispose(false); 
  36.    } 
  37.  
  38.    // 允許多次調(diào)用Dispose,但會(huì)拋出異常publicvoid DoSomething() 
  39.    { 
  40.       if(this.disposed) 
  41.       { 
  42.          thrownew ObjectDisposedException(); 
  43.       } 
  44.    } 
  • 實(shí)現(xiàn) Close 方法

對(duì)于類型來(lái)說(shuō),若調(diào)用 Close 方法比調(diào)用 Dispose 方法更容易,則可以向基類型添加一個(gè)公共 Close 方法。Close 方法又會(huì)調(diào)用沒(méi)有參數(shù)的 Dispose 方法,該方法可以執(zhí)行正確的清理操作。在基礎(chǔ)類庫(kù)中的所有類的Close方法都是基于該原理構(gòu)造的。

 
 
 
  1. public void Close() 
  2.    // 釋放資源 
  3.    Dispose(); 

Finalize(終結(jié)器)

對(duì)于您的應(yīng)用程序創(chuàng)建的大多數(shù)對(duì)象,可以依靠 .NET Framework 的垃圾回收器隱式地執(zhí)行所有必要的內(nèi)存管理任務(wù)。但是,在您創(chuàng)建封裝非托管資源的對(duì)象時(shí),當(dāng)您在應(yīng)用程序中使用完這些非托管資源之后,您必須顯式地釋放它們。

雖然垃圾回收器可以跟蹤封裝非托管資源的對(duì)象的生存期,但它不了解具體如何清理這些資源。對(duì)于這些類型的對(duì)象,.NET Framework 提供 Object.Finalize 方法,它允許對(duì)象在垃圾回收器回收該對(duì)象使用的內(nèi)存時(shí)適當(dāng)清理其非托管資源。但是對(duì)托管對(duì)象就不應(yīng)該實(shí)現(xiàn) Finalize方法,因?yàn)槔厥掌鲿?huì)自動(dòng)清理托管資源。

默認(rèn)情況下,F(xiàn)inalize 方法不執(zhí)行任何操作。如果您要讓垃圾回收器在回收對(duì)象的內(nèi)存之前對(duì)對(duì)象執(zhí)行清理操作,您必須在類中重寫(xiě) Finalize 方法。但是在 C# 或 C++ 編程語(yǔ)言中無(wú)法重寫(xiě) Finalize 方法,所以在 C# 中可使用析構(gòu)函數(shù)語(yǔ)法實(shí)現(xiàn) Finalize 方法。

Finalize 方法主要是在未能調(diào)用 Dispose 方法的情況下充當(dāng)防護(hù)措施來(lái)清理資源。

實(shí)現(xiàn) Finalize 方法或析構(gòu)函數(shù)對(duì)性能可能會(huì)有負(fù)面影響,因此應(yīng)避免不必要地使用它們。

用 Finalize 方法回收對(duì)象使用的內(nèi)存需要至少兩次垃圾回收。當(dāng)垃圾回收器執(zhí)行回收時(shí),它只回收沒(méi)有終結(jié)器的不可訪問(wèn)對(duì)象的內(nèi)存。這時(shí),它不能回收具有終結(jié)器的不可訪問(wèn)對(duì)象。它改為將這些對(duì)象的項(xiàng)從終止隊(duì)列中移除并將它們放置在標(biāo)為準(zhǔn)備終止的對(duì)象列表中。該列表中的項(xiàng)指向托管堆中準(zhǔn)備被調(diào)用其終止代碼的對(duì)象。垃圾回收器為此列表中的對(duì)象調(diào)用 Finalize 方法,然后,將這些項(xiàng)從列表中移除。后來(lái)的垃圾回收將確定終止的對(duì)象確實(shí)是垃圾,因?yàn)闃?biāo)為準(zhǔn)備終止對(duì)象的列表中的項(xiàng)不再指向它們。在后來(lái)的垃圾回收中,實(shí)際上回收了對(duì)象的內(nèi)存。

  • 封裝資源對(duì)象

     如果您要編寫(xiě)代碼,而該代碼使用一個(gè)封裝資源的對(duì)象,您應(yīng)該確保在使用完該對(duì)象時(shí)調(diào)用該對(duì)象的 Dispose 方法。

  • 封裝方式
    • using語(yǔ)句
    • try/finally塊 

文章名稱:.NET清理非托管資源
分享地址:http://uogjgqi.cn/article/ccsjigj.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流