精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一区视频二区视频| 亚洲第一福利网站| 欧美视频小说| 91亚洲欧美激情| 国内视频精品| 亚洲欧美在线x视频| www.久久91| 污污视频在线看| 在线视频国产区| 国产一区二区三区黄网站| 中文字幕一区二区三区四区 | 污污网站在线看| 91视频观看免费| 91在线国产电影| 在线观看日本视频| 亚洲午夜精品一区 二区 三区| 亚洲国产精品大全| 中文字幕视频三区| 日韩影院在线| 亚洲免费电影在线| 日本视频精品一区| 日本免费网站在线观看| 另类小说一区二区三区| 97成人精品视频在线观看| 午夜激情视频在线播放| 日韩美脚连裤袜丝袜在线| 在线综合亚洲欧美在线视频| 日韩精品一区二区三区色欲av| a级在线观看| 国产欧美一区二区精品性色超碰 | 人妻少妇精品无码专区| 蜜臀91精品一区二区三区| 欧美一级在线亚洲天堂| 欧美久久久久久久久久久久| 日韩一区二区三区免费播放| 日韩精品久久久久久福利| 免费观看一区二区三区| 亚洲成人高清| 欧美日韩一卡二卡| 成人在线看视频| 中文在线аv在线| 亚洲欧美偷拍自拍| 懂色av噜噜一区二区三区av| 国产成人综合久久| 日韩精品视频免费看| 91成人免费| 中文字幕日韩综合av| 深爱五月激情网| 噜噜噜狠狠夜夜躁精品仙踪林| 欧美一级夜夜爽| 中文字幕色网站| 性欧美video另类hd尤物| 在线视频欧美区| 毛片av免费在线观看| 天天综合av| 精品福利樱桃av导航| 国产亚洲黄色片| 蜜臀av在线| 亚洲一区中文日韩| 日韩精品在线中文字幕| 俄罗斯一级**毛片在线播放 | 狼狼综合久久久久综合网| 亚洲a视频在线| 成人三级在线视频| 精品久久久久久亚洲| 亚州男人的天堂| 国产亚洲综合在线| 亚洲精品中字| 激情在线小视频| 亚洲自拍偷拍麻豆| 黄色av网址在线播放| 欧美性suv| 精品视频免费在线| 被黑人猛躁10次高潮视频| 亚洲精品在线播放| 精品视频在线观看日韩| a资源在线观看| 在线精品视频在线观看高清| 久久久久久成人| 国产成人免费看| 人人狠狠综合久久亚洲| 亚洲一区二区三区乱码aⅴ蜜桃女| av资源免费看| 91麻豆精东视频| 亚洲精品一区二| 日本电影在线观看| 色综合色狠狠天天综合色| 手机视频在线观看| 午夜免费欧美电影| 日韩精品亚洲元码| 国产一区二区三区视频播放| 欧美私人啪啪vps| 欧美综合国产精品久久丁香| 一本色道久久综合无码人妻| 高清不卡一二三区| 日韩精品久久久毛片一区二区| 米奇精品一区二区三区| 亚洲国产日韩综合久久精品| 热久久精品免费视频| 日韩中文字幕视频网| 亚洲免费伊人电影在线观看av| 蜜桃视频最新网址| 亚洲高清免费| 国产日韩视频在线观看| 日韩中文字幕影院| 中文字幕一区三区| 成人在线看视频| julia中文字幕一区二区99在线| 日韩精品极品在线观看播放免费视频| 天天色影综合网| 久久精品国产清高在天天线| 91黄色精品| 超碰免费97在线观看| 亚洲综合在线五月| 91高清国产视频| 亚洲免费专区| 欧美激情精品久久久久久蜜臀| 久久精品国产亚洲av麻豆蜜芽| 国产91精品一区二区麻豆亚洲| 欧美在线视频一区二区三区| 久久久久黄久久免费漫画| 欧美日韩中文国产| 国产精品三级在线观看无码| 好看不卡的中文字幕| 成人www视频在线观看| 天天操天天舔天天干| 一区二区三区资源| 天堂av在线8| 精品久久成人| 日韩av大片免费看| 亚洲av成人无码久久精品老人 | 一级黄色免费在线观看| 欧美www.| 亚洲男人的天堂在线| 日韩特黄一级片| 国产成人av一区二区三区在线 | 免费毛片在线看片免费丝瓜视频| 欧美精品日韩一区| 亚洲女人毛茸茸高潮| 蜜臀av性久久久久蜜臀aⅴ| 欧美一区二区三区四区在线观看地址| 国产欧洲在线| 日韩av在线直播| 国产成人无码精品| 97久久精品人人爽人人爽蜜臀| 男人添女荫道口喷水视频| 欧美激情三级| 欧美激情综合色综合啪啪五月| 国产高清第一页| 亚洲免费观看高清完整版在线| 一级片免费在线观看视频| 久久亚洲影视| 91精品视频在线播放| 国产黄色小视频在线| 91精品国产综合久久香蕉麻豆| 在线免费看av网站| 国产一区二区免费视频| 日本福利视频在线观看| 国产精品网址| 清纯唯美亚洲激情| wwwxxx在线观看| 欧美日韩中文国产| 欧美日韩成人免费观看| 懂色av中文一区二区三区| 精品视频免费在线播放| 一区二区三区视频免费观看| 国产精品va在线播放我和闺蜜| melody高清在线观看| 51午夜精品国产| 国产亚洲精品久久久久久打不开| jlzzjlzz国产精品久久| 欧美 日韩精品| 第一sis亚洲原创| 亚洲自拍高清视频网站| 国产传媒在线观看| 国产午夜精品一区二区三区 | 麻豆精品视频在线观看视频| 天天爱天天做天天操| 波多野结衣一区二区三区免费视频| 国内久久久精品| 黄色av网站在线| 777色狠狠一区二区三区| 久久精品国产精品亚洲精品| 国产精品一区二区a| 日本免费一区二区六区| 亚洲欧洲高清在线| 亚洲怡红院av| 亚洲成人激情av| 在线不卡av电影| 国模大尺度一区二区三区| 日韩一级片免费视频| 精品国产精品| 亚洲最大av在线| 345成人影院| 不卡av电影在线观看| 五月天婷婷视频| 欧美三级韩国三级日本一级| 豆国产97在线 | 亚洲| 国产日韩欧美在线一区| 爱情岛论坛亚洲自拍| 香蕉国产精品偷在线观看不卡| 视频一区二区视频| 日本在线中文字幕一区| 91久久久久久久一区二区| 中文字幕高清在线播放| 久久av在线看| 国产玉足榨精视频在线观看| 日韩欧美一级在线播放| 久操视频在线免费观看| 亚洲一二三四在线观看| 五月婷婷综合激情网| 99国产精品国产精品久久| 91性高潮久久久久久久| 日韩av电影天堂| 亚洲人成无码网站久久99热国产 | 成年人av电影| 国产午夜三级一区二区三| 亚洲麻豆一区二区三区| 国内精品伊人久久久久av一坑| 国产精品69页| 国产情侣一区| 国产精品久久久影院| 精品99久久| 精品国产乱码久久久久| 我看黄色一级片| 亚洲影音一区| 欧美又粗又长又爽做受| 亚洲一区二区三区| 亚洲欧洲中文| 欧美精品系列| 91麻豆精品国产91久久久使用方法 | 50度灰在线| 国产亚洲一区二区精品| 亚洲 美腿 欧美 偷拍| 欧美成人福利视频| 国产高清免费观看| 欧美一区欧美二区| 国产精品久久久久久免费免熟| 欧美性生活影院| 中文字幕乱码视频| 欧美综合久久久| 国产一级片一区二区| 欧洲国产伦久久久久久久| 精产国品一区二区| 色狠狠一区二区| 国产网站免费在线观看| 美女的胸无遮挡在线观看 | 51蜜桃传媒精品一区二区| 欧美黄页免费| 成人免费福利在线| 中文字幕成人| 114国产精品久久免费观看| 国产美女亚洲精品7777| 91九色精品视频| 蜜桃在线一区| 国产精品日韩二区| 欧美丝袜足交| 日本精品视频一区| 欧美精选视频在线观看| 亚洲在线不卡| 天天超碰亚洲| 青青在线免费观看| 亚洲视频成人| 超碰在线97免费| 精品亚洲porn| 亚洲一二三四五| 91欧美一区二区| 91麻豆制片厂| 亚洲欧美偷拍另类a∨色屁股| 97成人资源站| 亚洲国产精品麻豆| 黄色av网站免费观看| 欧美精品在线观看播放| www黄色网址| 日韩精品在线免费观看| 91精品专区| 欧美另类老女人| 成人bbav| 国产精品视频yy9099| 一区二区三区视频播放| 久久日韩精品| 天天操夜夜操国产精品| 浮妇高潮喷白浆视频| 男男成人高潮片免费网站| 激情成人在线观看| 久久精品欧美日韩| 国产av 一区二区三区| 欧美日韩免费观看中文| 亚洲在线视频播放| 精品国产乱码久久久久久图片| 激情综合闲人网| 欧美理论片在线观看| 欧美电影网站| 999国产在线| 精品国产一区二区三区小蝌蚪| 欧美一区二区三区综合| 久久精品综合| 成人做爰69片免费| 欧美国产日韩亚洲一区| 国产精品99精品| 精品视频一区三区九区| 国产 欧美 自拍| 色妞久久福利网| 自拍偷拍亚洲视频| 亚洲在线观看视频| 大色综合视频网站在线播放| 黄色www网站| 国产精品一区免费在线观看| 男女做爰猛烈刺激| 亚洲一级电影视频| 国产情侣自拍小视频| 亚洲天堂网在线观看| 成人在线免费观看视频网站| 另类视频在线| 国产精品久久久久久久天堂| 哺乳一区二区三区中文视频| 一区二区精品视频| 日韩国产欧美在线播放| xxxx黄色片| 亚洲宅男天堂在线观看无病毒| 午夜视频网站在线观看| 国产视频精品自拍| www欧美xxxx| 99精品国产一区二区| 日韩欧美精品| 青青草精品视频在线观看| 91网址在线看| 一级片中文字幕| 亚洲黄色av女优在线观看| 国产区美女在线| 成人片在线免费看| 亚洲影视一区| 污视频在线观看免费网站| 国产精品久久久久久久久动漫| 久久久精品毛片| 亚洲人线精品午夜| 伊伊综合在线| 欧美日韩精品综合| 久久国产日韩| 国产中年熟女高潮大集合| 色综合天天综合网天天看片| 亚洲精品综合久久| 欧美精品国产精品日韩精品| 一区二区三区高清在线观看| 欧美精品在欧美一区二区| 国产高清不卡二三区| 麻豆视频在线观看| 精品免费国产二区三区| 俄罗斯一级**毛片在线播放| 国产亚洲精品美女久久久m| 在线播放亚洲| 99久久国产精| 日韩欧美在线网址 | 粉嫩av一区二区三区四区五区| 欧洲精品在线一区| 免费看精品久久片| 天堂网中文在线观看| 欧美日韩精品一二三区| 欧美精品videos另类| 97超碰人人看人人| 亚洲激情影院| 无码一区二区三区在线| 欧美丝袜第三区| 在线你懂的视频| 国产一区二区三区黄| 天堂va蜜桃一区二区三区| 貂蝉被到爽流白浆在线观看| 91精品国产综合久久精品图片| 中文字幕有码在线视频| 国产一区二区三区四区五区在线 | 三级视频在线| 国产精品久久久久久久久男| 91超碰成人| 538国产视频| 欧美日韩一区二区欧美激情 | 日韩免费在线看| 日本一本不卡| 日本人妻一区二区三区| 欧美色另类天堂2015| 天堂中文а√在线| 成人av中文| 日韩av中文在线观看| 999精品在线视频| 欧美精品一区二区精品网| 日韩三区免费| 国产人妻人伦精品| 久久久三级国产网站| 国产视频手机在线| 2019中文字幕在线观看| 久久视频国产| 麻豆国产精品一区| 666欧美在线视频| 91在线视频精品| 少妇精品在线| 国模杨依粉嫩蝴蝶150p| 1区2区3区欧美| 污污的视频网站在线观看| 国产精品入口日韩视频大尺度| 一区二区三区在线电影| 国产夫妻性爱视频|