精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談C#中標準Dispose模式的實現

開發 后端
C#程序中的Dispose方法,一旦被調用了該方法的對象,雖然還沒有垃圾回收,但實際上已經不能再使用了。所以使用上要仔細考慮細節。

需要明確一下C#程序(或者說.NET)中的資源。簡單的說來,C#中的每一個類型都代表一種資源,而資源又分為兩類:

托管資源:由CLR管理分配和釋放的資源,即由CLR里new出來的對象;

非托管資源:不受CLR管理的對象,windows內核對象,如文件、數據庫連接、套接字、COM對象等;

毫無例外地,如果我們的類型使用到了非托管資源,或者需要顯式釋放的托管資源,那么,就需要讓類型繼承接口IDisposable。這相當于是告訴調用者,該類型是需要顯式釋放資源的,你需要調用我的Dispose方法。

不過,這一切并不這么簡單,一個標準的繼承了IDisposable接口的類型應該像下面這樣去實現。這種實現我們稱之為Dispose模式:

  1. public class SampleClass : IDisposable    
  2.   {        
  3.   //演示創建一個非托管資源          
  4. private IntPtr nativeResource = Marshal.AllocHGlobal(100);          
  5. //演示創建一個托管資源          
  6. private AnotherResource managedResource = new AnotherResource();          
  7. private bool disposed = false;         
  8.  /// <summary>          
  9. /// 實現IDisposable中的Dispose方法         
  10.  /// </summary>          
  11. public void Dispose()       
  12.    {             
  13.  //必須為true             
  14.  Dispose(true);             
  15.  //通知垃圾回收機制不再調用終結器(析構器)         
  16.    GC.SuppressFinalize(this);       
  17.    }         
  18.  /// <summary>         
  19.  /// 不是必要的,提供一個Close方法僅僅是為了更符合其他語言(如C++)的規范          
  20. /// </summary>          
  21. public void Close()        
  22.   {            
  23.   Dispose();       
  24.    }        
  25.   /// <summary>       
  26.    /// 必須,以備程序員忘記了顯式調用Dispose方法      
  27.     /// </summary>         
  28.  ~SampleClass()        
  29.   {          
  30.     //必須為false           
  31.    Dispose(false);      
  32.     }          
  33. /// <summary>          
  34. /// 非密封類修飾用protected virtual        
  35.   /// 密封類修飾用private        
  36.   /// </summary>         
  37.  /// <param name="disposing"></param>    
  38.       protected virtual void Dispose(bool disposing)          
  39. {             
  40.  if (disposed)           
  41.    {               
  42.    return;          
  43.     }          
  44.     if (disposing)         
  45.      {             
  46.      // 清理托管資源              
  47.     if (managedResource != null)              
  48.   {                  
  49.     managedResource.Dispose();                
  50.     managedResource = null;              
  51.     }       
  52.        }            
  53.   // 清理非托管資源           
  54.    if (nativeResource != IntPtr.Zero)         
  55.    {              
  56.     Marshal.FreeHGlobal(nativeResource);        
  57.         nativeResource = IntPtr.Zero;        
  58.       }             
  59.  //讓類型知道自己已經被釋放           
  60.    disposed = true;    
  61.       }     
  62.      public void SamplePublicMethod()       
  63.    {             
  64.  if (disposed)         
  65.      {               
  66.    throw new ObjectDisposedException("SampleClass""SampleClass is disposed");       
  67.        }        
  68.       //省略        
  69.   }    } 

在Dispose模式中,幾乎每一行都有特殊的含義。

在標準的Dispose模式中,我們注意到一個以~開頭的方法:

  1. /// <summary>       
  2.   /// 必須,以備程序員忘記了顯式調用Dispose方法      
  3.    /// </summary>        
  4.  ~SampleClass()       
  5.   {             
  6. //必須為false           
  7.   Dispose(false);     
  8.     }  

這個方法叫做類型的終結器。提供終結器的全部意義在于:我們不能奢望類型的調用者肯定會主動調用Dispose方法,基于終結器會被垃圾回收器調用這個特點,終結器被用做資源釋放的補救措施。

一個類型的Dispose方法應該允許被多次調用而不拋異常。鑒于這個原因,類型內部維護了一個私有的布爾型變量disposed:

  1. private bool disposed = false

在實際處理代碼清理的方法中,加入了如下的判斷語句:

  1. if (disposed)      
  2.         {               
  3.    return;          
  4.     }             
  5.  //省略清理部分的代碼,并在方法的***為disposed賦值為true              
  6. disposed = true

這意味著類型如果被清理過一次,則清理工作將不再進行。

應該注意到:在標準的Dispose模式中,真正實現IDisposable接口的Dispose方法,并沒有實際的清理工作,它實際調用的是下面這個帶布爾參數的受保護的虛方法:

  1.       /// <summary>       
  2.  /// 非密封類修飾用protected virtual        
  3. /// 密封類修飾用private       
  4.  /// </summary>        
  5. /// <param name="disposing"></param>       
  6.  protected virtual void Dispose(bool disposing)      
  7.   {            
  8. //省略代碼    
  9.     } 

之所以提供這樣一個受保護的虛方法,是為了考慮到這個類型會被其他類繼承的情況。如果類型存在一個子類,子類也許會實現自己的Dispose模式。受保護的虛方法用來提醒子類必須在實現自己的清理方法的時候注意到父類的清理工作,即子類需要在自己的釋放方法中調用base.Dispose方法。
還有,我們應該已經注意到了真正撰寫資源釋放代碼的那個虛方法是帶有一個布爾參數的。之所以提供這個參數,是因為我們在資源釋放時要區別對待托管資源和非托管資源。

在供調用者調用的顯式釋放資源的無參Dispose方法中,調用參數是true:

  1. public void Dispose()      
  2.     {            
  3.   //必須為true         
  4.      Dispose(true);        
  5.       //其他省略        
  6.   } 

這表明,這個時候代碼要同時處理托管資源和非托管資源。

在供垃圾回收器調用的隱式清理資源的終結器中,調用參數是false:

  1. ~SampleClass()        
  2.   {         
  3.      //必須為false         
  4.      Dispose(false);    
  5.       } 

這表明,隱式清理時,只要處理非托管資源就可以了。

那么,為什么要區別對待托管資源和非托管資源。在認真闡述這個問題之前,我們需要首先弄明白:托管資源需要手動清理嗎?不妨先將C#中的類型分為兩類,一類繼承了IDisposable接口,一類則沒有繼承。前者,我們暫時稱之為非普通類型,后者我們稱之為普通類型。非普通類型因為包含非托管資源,所以它需要繼承IDisposable接口,但是,這個包含非托管資源的類型本身,它是一個托管資源。所以說,托管資源需要手動清理嗎?這個問題的答案是:托管資源中的普通類型,不需要手動清理,而非普通類型,是需要手動清理的(即調用Dispose方法)。

Dispose模式設計的思路基于:如果調用者顯式調用了Dispose方法,那么類型就該按部就班為自己的所以資源全部釋放掉。如果調用者忘記調用Dispose方法,那么類型就假定自己的所有托管資源(哪怕是那些上段中闡述的非普通類型)全部交給垃圾回收器去回收,而不進行手工清理。理解了這一點,我們就理解了為什么Dispose方法中,虛方法傳入的參數是true,而終結器中,虛方法傳入的參數是true。 

注意:我們提到了需要及時釋放資源,卻并沒有進一步細說是否需要及時讓引用等于null這一點。有一些人認為等于null可以幫助垃圾回收機制早點發現并標識對象是垃圾。其他人則認為這沒有任何幫助。下一篇我們再細說這一點。

原文鏈接:http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html

【編輯推薦】

  1. C#取整函數實例應用詳解
  2. C#單元測試的一個小故事
  3. C#單元測試使用的必要性的淺析
  4. C#單元測試概念及作用的淺析
  5. C#單元測試的運行淺析



【責任編輯:彭凡 TEL:(010)68476606】

 

責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-07 09:53:01

C# DisposeDispose方法

2009-09-07 09:36:29

C# DisposeDispose方法

2009-08-31 16:33:28

C#調用Dispose

2009-09-02 16:23:27

C# Singleto

2009-09-11 10:59:06

Effective C調用Dispose()

2009-08-04 09:22:26

C#工廠模式

2009-08-17 17:16:19

C#實現在線升級

2009-06-16 10:20:05

多繼承C#

2009-07-22 17:15:04

C#實現

2011-09-21 10:56:31

C#結構

2009-08-20 18:30:33

C# ReaderWr

2010-01-27 16:33:07

C++中標準輸入

2009-08-14 10:51:43

2009-09-17 17:13:54

C#數組

2009-08-25 18:04:30

C#實現Singlet

2009-09-11 12:17:59

C#控件屬性

2009-08-20 10:24:52

C#開發WinForm

2009-08-26 15:46:01

C#匿名類型

2009-08-14 17:58:05

C#接口方法

2009-09-02 15:41:21

C# HTTPWebR
點贊
收藏

51CTO技術棧公眾號

日韩一级在线| 伊人久久国产| 国产a区久久久| 97香蕉久久超级碰碰高清版| 双性尿奴穿贞c带憋尿| 天天免费亚洲黑人免费| 最新中文字幕一区二区三区| 国产精品免费看一区二区三区| 日韩精品一区二区亚洲av| 大胆日韩av| 欧美精品一区二区在线播放| 国产一区二区视频免费在线观看| 国产区在线观看| 99久久精品国产一区| 国产日韩av在线播放| 福利一区二区三区四区| 色135综合网| 亚洲国产精品推荐| 中文字幕永久有效| 精品3atv在线视频| 亚洲大尺度视频在线观看| 亚洲欧洲精品在线 | 麻豆久久久久久久| 国产成人天天5g影院在线观看| 视频欧美精品| 精品露脸国产偷人在视频| 亚洲看片网站| 欧美理论在线观看| 成人禁用看黄a在线| 国产日本欧美视频| 精品人妻一区二区色欲产成人| 女生裸体视频一区二区三区| 国产一区二区三区直播精品电影 | www.国产毛片| 国产精品www.| 久久久精品免费视频| 无码人妻精品一区二区中文| 国产精品视频3p| 欧美一级日韩一级| 在线看免费毛片| 日韩在线观看不卡| 色噜噜夜夜夜综合网| 妞干网在线视频观看| 性xxxfreexxxx性欧美| 国产精品久久久久久久第一福利| 久久精品亚洲麻豆av一区二区| 亚洲日本欧美中文幕| 免费看黄色片的网站| 欧美视频精品全部免费观看| 欧美三级在线播放| 在线免费av播放| 国产综合av| 在线看国产日韩| 成人免费xxxxx在线视频| 黑人巨大亚洲一区二区久 | 久久男人中文字幕资源站| 国产精品一区二区三区在线| 亚洲精品97久久中文字幕无码| 国产精品综合二区| av在线不卡观看| 免费观看黄一级视频| 成人免费精品视频| 精品一区二区三区国产| 欧美日韩视频精品二区| 久久婷婷国产综合精品青草| 日韩av在线一区二区三区| 福利视频在线播放| 中文字幕制服丝袜成人av| 一区二区三区不卡在线| 最新黄网在线观看| 一级做a爱片久久| 久久综合九色综合88i| 天堂中文最新版在线中文| 色婷婷精品大视频在线蜜桃视频| 欧美激情精品久久久久久小说| 欧美日韩尤物久久| 777a∨成人精品桃花网| 国产精九九网站漫画| 欧美一级全黄| 尤物九九久久国产精品的分类| 成人午夜免费影院| 日韩xxx视频| av成人综合| 日韩av网站导航| 国产肥白大熟妇bbbb视频| 精品一区二区三区中文字幕老牛| 中文字幕无线精品亚洲乱码一区 | 青青青手机在线视频| 香蕉视频官网在线观看日本一区二区| 精品国产拍在线观看| 青青草手机在线视频| 国产精品试看| 成人美女免费网站视频| 黑人精品一区二区| 国产欧美一区二区精品性色 | 高清电影在线免费观看| 欧美日韩一区二区免费在线观看| 污版视频在线观看| 蜜臀av一区| www亚洲欧美| 亚洲精品男人天堂| 韩国精品久久久| 久久亚裔精品欧美| 99自拍视频在线观看| 一本大道久久a久久精品综合 | 成人免费视频网站在线观看| 欧美18视频| 日本精品600av| 色94色欧美sute亚洲线路一ni| 午夜激情影院在线观看| 免费视频国产一区| 久久久久久com| 一级淫片免费看| 91视频精品在这里| 老司机午夜网站| 精品欧美一区二区三区在线观看| 欧美成人aa大片| 99自拍偷拍视频| 欧美亚洲一区二区三区| av资源站久久亚洲| 蜜桃视频在线观看www社区 | 欧美洲成人男女午夜视频| 国产精品久久久久久久一区二区 | 久久这里只有精品免费| 麻豆精品国产91久久久久久 | 国内成人自拍| 午夜精品蜜臀一区二区三区免费 | 亚洲激情自拍图| 91插插插插插插| 经典三级在线一区| 四虎永久国产精品| 中文一区一区三区高中清不卡免费| 欧美精选午夜久久久乱码6080| 男生草女生视频| 亚洲国内精品| 国产精品永久入口久久久| 操你啦视频在线| 欧美日韩精品专区| 欧美a在线播放| 免费美女久久99| 四虎永久国产精品| av成人免费看| 中文字幕欧美在线| 又污又黄的网站| 亚洲国产高清在线| 亚洲国产高清av| 欧美成免费一区二区视频| 国产精品视频一区二区三区四| 番号在线播放| 欧美日韩在线播放| 林心如三级全黄裸体| 青娱乐精品视频| 亚洲精品第一区二区三区| 电影亚洲一区| 精品国产一区二区三区四区在线观看| 亚洲视频中文字幕在线观看| 国产精品高潮呻吟| 国产在线视频三区| 狠狠88综合久久久久综合网| 国产精品成人一区二区三区| 福利成人导航| 日韩电影免费在线观看中文字幕| 国产女同在线观看| 久久久综合精品| 日本999视频| 色综合色综合| 51午夜精品| ****av在线网毛片| 亚洲免费影视第一页| 日本三级一区二区三区| 国产精品国产三级国产aⅴ中文 | 欧美中文高清| 久久久在线免费观看| 亚洲人午夜射精精品日韩| 色av综合在线| 69av视频在线| 高清久久久久久| 日韩a在线播放| 日韩欧美精品综合| 福利视频久久| 欧美精品高清| 久操成人在线视频| 三级黄视频在线观看| 欧美日韩在线精品一区二区三区激情| 国产又黄又爽又无遮挡| 久久青草欧美一区二区三区| 亚洲小视频网站| 日韩视频中文| 亚洲欧美日韩另类精品一区二区三区 | 中文字幕第66页| 伊人成年综合电影网| 日本高清不卡三区| 视频一区日韩精品| 日韩av手机在线观看| 国产精品刘玥久久一区| 日韩精品欧美激情| 国产露脸国语对白在线| 天天影视网天天综合色在线播放| 在线观看日本黄色| 99麻豆久久久国产精品免费优播| 性chinese极品按摩| 亚洲国产日本| 超碰97在线看| 成人在线国产| 久久精品国产99精品国产亚洲性色| 日韩免费大片| 日本中文字幕成人| 欧美性受ⅹ╳╳╳黑人a性爽| 亚洲色图在线观看| 亚洲精品久久久久avwww潮水| 欧洲精品视频在线观看| 日本少妇毛茸茸高潮| 亚洲四区在线观看| 免费看黄色av| 91免费视频网址| 伊人av在线播放| 麻豆一区二区三区| 国产一级不卡毛片| 999亚洲国产精| 国产又粗又猛又爽又黄的网站| 成人激情视频| 欧美激情第一页在线观看| 88久久精品| 成人国产在线视频| 激情久久99| 国产成人avxxxxx在线看| 国产直播在线| 欧美激情视频免费观看| 污污影院在线观看| 国产黄色精品| 欧美巨猛xxxx猛交黑人97人| 成人av一区| 亚洲色图第三页| 四虎精品在线| 日韩精品在线视频观看| 内射无码专区久久亚洲| 精品欧美一区二区在线观看 | 久久国产生活片100| 可以免费在线看黄的网站| 在线一区视频| 国产青青在线视频| 亚洲少妇一区| 97国产精东麻豆人妻电影| 亚洲福利久久| 欧美 日韩 国产 高清| 99精品热6080yy久久| 国产极品在线视频| 美女国产一区| 爱情岛论坛成人| 免费成人在线影院| 亚洲国产日韩欧美在线观看| 免费观看30秒视频久久| 成人性生交免费看| 久久精品av麻豆的观看方式| 男生操女生视频在线观看 | 日本福利在线| 久久精品欧美视频| 九义人在线观看完整免费版电视剧| 日韩综合中文字幕| 国产淫片在线观看| 欧美国产第二页| 久草在线中文最新视频| 欧美制服第一页| 成人午夜亚洲| 91久久久免费一区二区| 中国特级黄色大片| 99精品在线免费| 先锋影音av在线| 综合中文字幕亚洲| 久久久久久蜜桃| 狠狠做深爱婷婷久久综合一区| 尤物视频免费观看| 91麻豆精品国产91| 黑人精品一区二区| 伊人久久五月天| 18av在线视频| 奇门遁甲1982国语版免费观看高清| 嫩草伊人久久精品少妇av杨幂| 成人做爰www免费看视频网站| 在线精品自拍| 日本成人黄色免费看| 中国精品18videos性欧美| 欧美激情 国产精品| 免费成人av在线播放| 亚洲av无码成人精品区| 久久久综合精品| 国产精品九九九九九九| 欧美午夜视频一区二区| 国产尤物在线观看| 日韩精品一二三四区| 色影视在线观看| 6080yy精品一区二区三区| 欧美亚洲人成在线| 精品乱码一区二区三区| 99精品在线免费在线观看| 奇米影视亚洲色图| 看片的网站亚洲| 色天使在线视频| 亚洲精品国产第一综合99久久| 亚洲 欧美 成人| 日韩欧美www| 999国产在线视频| 91av在线精品| 亚洲精品一区二区三区在线| 亚洲精品第一区二区三区| 国产亚洲福利| 又色又爽又黄18网站| 国产精品欧美一级免费| 久草视频在线观| 日韩女优电影在线观看| 9191在线| 国产99视频精品免视看7| 中文字幕一区二区三区日韩精品| 视频一区视频二区视频| 午夜亚洲一区| 中国免费黄色片| 亚洲欧美日韩在线| 亚洲熟妇av乱码在线观看| 亚洲区在线播放| 国产网站在线| 国产一区二区精品在线| 涩涩网在线视频| 欧美日韩亚洲视频一区| 97人妻精品一区二区三区软件| 亚洲毛片在线看| 678在线观看视频| 91文字幕巨乱亚洲香蕉| 婷婷丁香综合| 性生生活大片免费看视频| 日本一二三不卡| 中文字幕乱码在线观看| 国产亚洲精品久久久久动| 亚洲美女久久精品| 另类欧美小说| 乱码第一页成人| 97人妻精品一区二区三区免| 亚洲国产视频网站| 后入内射欧美99二区视频| 欧美成人精品一区二区| 国产一区二区高清在线| 中文字幕剧情在线观看一区| 奇米色777欧美一区二区| 免费看黄色三级| 欧美日韩国产一区二区三区地区| 触手亚洲一区二区三区| 国产精品999999| 欧美日韩激情在线一区二区三区| 亚洲人成色77777| 国产日韩欧美一区二区三区乱码| 中文字幕xxxx| 亚洲日本成人网| 成人在线免费电影网站| 亚洲一区二区精品在线观看| 极品美女销魂一区二区三区| 欧美成人777| 欧美xxx久久| 超碰在线公开| 欧美三级网色| 男女性色大片免费观看一区二区| 亚洲熟女少妇一区二区| 56国语精品自产拍在线观看| 亚洲婷婷噜噜| 精品视频高清无人区区二区三区| 香蕉av777xxx色综合一区| 麻豆精品免费视频| 欧美日韩国产在线观看| 日韩av官网| 欧美性大战久久久久| 精品一区二区三区视频在线观看 | 欧美.日韩.国产.一区.二区| 69久久精品无码一区二区| 亚洲国产精品一区二区尤物区| 日本一二三区在线视频| 国产精品久久一区| 欧美在线三区| 中文字幕人妻一区二区| 欧美日韩国产高清一区| 免费在线观看的电影网站| 久久久久资源| 精品一区精品二区高清| 亚欧洲精品在线视频| 亚洲视频日韩精品| 日韩影片在线观看| 久久综合久久色| 亚洲免费观看高清完整版在线观看 | 亚洲最新在线| 成人午夜视频在线| 久久精品国产亚洲av麻豆蜜芽| 欧美另类暴力丝袜| 久久不见久久见免费视频7| 久久久九九九热| 色综合 综合色| 91精选在线| 日韩欧美视频第二区| 成人三级在线视频| 一区二区视频免费| 亚洲91精品在线| 一本到12不卡视频在线dvd| 一级性生活毛片| 精品少妇一区二区三区免费观看|