成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET 清理非托管資源

開發(fā)
類型的 Dispose 方法應釋放它擁有的所有資源。它還應該通過調(diào)用其父類型的 Dispose 方法釋放其基類型擁有的所有資源。該父類型的 Dispose 方法應該釋放它擁有的所有資源并同樣也調(diào)用其父類型的 Dispose 方法,從而在整個基類型層次結(jié)構(gòu)中傳播此模式。
  • Dispose

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

  • 設(shè)計原則

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

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

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

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

Finalize(終結(jié)器)

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

雖然垃圾回收器可以跟蹤封裝非托管資源的對象的生存期,但它不了解具體如何清理這些資源。對于這些類型的對象,.NET Framework 提供 Object.Finalize 方法,它允許對象在垃圾回收器回收該對象使用的內(nèi)存時適當清理其非托管資源。但是對托管對象就不應該實現(xiàn) Finalize方法,因為垃圾回收器會自動清理托管資源。

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

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

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

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

  • 封裝資源對象

     如果您要編寫代碼,而該代碼使用一個封裝資源的對象,您應該確保在使用完該對象時調(diào)用該對象的 Dispose 方法。

  • 封裝方式
    • using語句
    • try/finally塊

原文鏈接:http://www.cnblogs.com/liusuqi/p/3160129.html

責任編輯:陳四芳 來源: M守護神
相關(guān)推薦

2009-04-02 15:21:43

c#IDisposeFinalize

2010-01-06 19:22:43

.NET Framew

2020-03-13 08:00:00

.NET對象清理垃圾回收

2023-07-07 13:56:54

2023-07-17 11:25:35

.NET程序WinDbgPerfview

2009-07-30 14:14:07

非托管COM組件

2011-02-22 09:16:24

高性能ASP.NET

2023-09-26 01:11:58

MES非托管泄露

2023-10-07 13:28:53

.NET軟件賬本

2022-09-13 17:46:19

STA模式內(nèi)存

2022-10-09 10:47:37

NET視覺軟件

2011-06-21 09:38:25

托管代碼非托管代碼

2010-01-25 15:55:50

托管C++

2010-01-06 18:27:06

.Net Framew

2009-08-19 10:25:18

C#托管資源

2014-12-26 10:58:35

托管云托管私有云公共云

2009-09-02 10:39:00

C#釋放托管資源

2022-11-15 14:29:18

2023-06-12 11:49:40

網(wǎng)絡(luò)交換機局域網(wǎng)

2016-11-21 15:13:19

LinuxDocker.NET Core
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩在线小视频 | 天天天堂| 国产精品乱码一区二三区小蝌蚪 | 粉嫩av在线| 欧美国产视频一区二区 | 一级黄色av电影 | 欧美日韩精品一区 | 国产一区成人 | 亚洲日韩中文字幕一区 | 日韩高清成人 | 国产高清精品在线 | 一区在线免费视频 | 男女视频在线观看网站 | 欧美性一区二区三区 | 黑人巨大精品欧美一区二区免费 | 中文字幕一二三区 | 综合色久| 日日日色| 免费观看一级毛片 | 国产精品久久久久久久久久久久久久 | 精品91av| 国产精品成人一区二区三区 | 欧美日韩精品免费观看 | 亚洲精品在线播放 | 欧美精品一二区 | 国产精品久久 | 久久久久久久久99精品 | 成人国产一区二区三区精品麻豆 | 久久久久国产精品 | 综合精品 | 国产区免费视频 | 成人性生交大片免费看中文带字幕 | 国产精品18久久久 | 亚洲精品久久久蜜桃网站 | 狠狠爱免费视频 | 福利精品在线观看 | 亚洲成人免费av | 亚洲欧美日韩在线 | 91免费高清视频 | 免费观看黄色一级片 | 成人片网址 |