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

C#調(diào)用析構方法詳解

開發(fā) 后端
這里介紹在釋放托管資源之前要先C#調(diào)用析構方法,然后第二次才真正釋放托管資源,這樣一來,兩次刪除動作的花銷比一次大多的!

在向大家詳細介紹C#調(diào)用析構方法之前,首先讓大家了解下C#中定義析構方法,然后全面介紹C#調(diào)用析構方法。

在C#中定義析構方法的格式是" ~CLASS_NAME() ".非常需要注意的是,如果一個類中沒有使用到非托管資源,那么請一定不要定義析構方法,這是因為對象執(zhí)行了析構方法,那么"垃圾回收器"在釋放托管資源之前要先C#調(diào)用析構方法,然后第二次才真正釋放托管資源,這樣一來,兩次刪除動作的花銷比一次大多的! (不過,即使你在類中已經(jīng)定義了析構方法,仍然有辦法"屏蔽"它,這將在后面的代碼范例中說明) 在析構方法中,就是用戶自己寫的釋放非托管資源的代碼段.

下面使用一段代碼來示范Dispose()方法和析構方法如何使用:

  1. public class ResourceHolder : System.IDisposable  
  2. {  
  3. public void Dispose()  
  4. {  
  5. Dispose(true);  
  6.  
  7. System.GC.SuppressFinalize(this);  
  8. // 上面一行代碼作用是防止"垃圾回收器"調(diào)用這個類中的方法  
  9. // " ~ResourceHolder() "  
  10. // 為什么要防止呢? 因為如果用戶記得調(diào)用Dispose()方法,那么  
  11. // "垃圾回收器"就沒有必要"多此一舉"地再去釋放一遍"非托管資源"了  
  12. // 如果用戶不記得調(diào)用呢,就讓"垃圾回收器"幫我們?nèi)?多此一舉"吧 ^_^  
  13. // 你看不懂我上面說的不要緊,下面我還有更詳細的解釋呢!  
  14. }  
  15.  
  16. protected virtual void Dispose(bool disposing)  
  17. {  
  18. if (disposing)  
  19. {  
  20. // 這里是清理"托管資源"的用戶代碼段  
  21. }  
  22. // 這里是清理"非托管資源"的用戶代碼段  
  23. }  
  24.  
  25. ~ResourceHolder()  
  26. {  
  27. Dispose(false);  
  28. }  

這里,我們必須要清楚,需要用戶調(diào)用的是方法Dispose()而不是方法Dispose(bool),然而,這里真正執(zhí)行釋放工作的方法卻并不是Dispose(),而是Dispose(bool) ! 為什么呢?仔細看代碼,在Dispose()中,調(diào)用了Dispose(true),而參數(shù)為"true"時,作用是清理所有的托管資源和非托管資源;大家一定還記得我前面才說過,"使用析構方法是用來釋放非托管資源的",那么這里既然Dispose()可以完成釋放非托管資源的工作,還要析構方法干什么呢? 其實,析構方法的作用僅僅是一個"備份"!

嚴格地說,凡執(zhí)行了接口"IDisposable"的類,那么只要程序員在代碼中使用了這個類的對象實例,那么早晚得調(diào)用這個類的Dispose()方法,同時,如果類中含有對非托管資源的使用,那么也必須釋放非托管資源! 可惜,如果釋放非托管資源的代碼放在析構方法中(上面的例子對應的是 " ~ResourceHolder() "),那么程序員想調(diào)用這段釋放代碼是不可能做到的(因為析構方法不能被用戶調(diào)用,只能被系統(tǒng),確切說是"垃圾回收器"調(diào)用),所以大家應該知道為什么上面例子中"清理非托管資源的用戶代碼段"是在Dispose(bool)中,而不是~ResourceHolder()中! 不過不幸的是,并不是所有的程序員都時刻小心地記得調(diào)用Dispose()方法,萬一程序員忘記調(diào)用此方法,托管資源當然沒問題,早晚會有"垃圾回收器"來回收(只不過會推遲一會兒),那么非托管資源呢?它可不受CLR的控制啊!難道它所占用的非托管資源就永遠不能釋放了嗎? 當然不是!我們還有"析構方法"呢! 如果忘記調(diào)用Dispose(),那么"垃圾回收器"也會C#調(diào)用析構方法來釋放非托管資源的!(多說一句廢話,如果程序員記得調(diào)用Dispose()的話,那么代碼"System.GC.SuppressFinalize(this);"則可以防止"垃圾回收器"C#調(diào)用析構方法,這樣就不必多釋放一次"非托管資源"了) 所以我們就不怕程序員忘記調(diào)用Dispose()方法了.

所以我說了這么一大堆的理由,綜合起來只有兩點:
◆程序員們啊,千萬不要忘記調(diào)用Dispose()方法! (如果有的話o(∩_∩)o...哈哈)
◆萬一忘記,不要著急...還有救!!! 因為還有"垃圾回收器"幫我們自動C#調(diào)用析構方法!

【編輯推薦】

  1. C#文法產(chǎn)生式概述
  2. C#類型聲明簡單分析
  3. C#命名空間和程序集學習筆記
  4. 利用C#清空回收站學習經(jīng)驗
  5. C# Color枚舉簡單描述
責任編輯:佚名 來源: 博客園
相關推薦

2009-08-14 17:24:28

C#構造函數(shù)和析構函數(shù)

2009-07-30 15:24:13

C#析構函數(shù)C#構造函數(shù)

2009-09-03 13:14:55

C#構造函數(shù)C#析構函數(shù)

2009-09-03 17:10:57

2009-08-31 16:33:28

C#調(diào)用Dispose

2009-08-31 18:05:14

C#調(diào)用WalkTre

2009-08-03 13:13:52

C#調(diào)用Outlook

2009-08-05 14:54:09

VB調(diào)用C#類庫

2025-02-18 00:08:00

代碼C++RAII

2009-09-03 14:20:21

C#日期格式化

2009-08-03 12:57:27

C#調(diào)用DLL

2009-08-20 13:47:57

C#驗證輸入方法

2025-05-12 03:10:00

接口方法代碼

2009-08-21 13:18:25

C#異步調(diào)用

2009-09-01 11:04:59

C#調(diào)用擴展方法

2009-09-02 13:15:23

C#數(shù)組復制

2010-02-04 16:39:26

C++析構函數(shù)

2010-01-18 15:53:27

C++析構函數(shù)

2009-08-12 16:38:35

C#讀取XML節(jié)點

2009-08-13 15:48:57

C#指針
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费看黄视频网站 | 天天色图 | 夜夜草 | 美女131mm久久爽爽免费 | 久久国产精品无码网站 | 国产免费观看视频 | 黄片毛片免费观看 | 插插宗合网| av一区在线观看 | 亚洲国产成人精品女人久久久 | 亚洲精品一区二区三区蜜桃久 | 欧美男人亚洲天堂 | 国产探花在线精品一区二区 | 国产一区二区在线看 | 国产日韩精品一区二区三区 | 久久久免费少妇高潮毛片 | 国产精品福利网 | 国产精品96久久久久久 | 最新国产精品视频 | 日韩免费在线视频 | 欧美精品在线一区 | 免费黄色大片 | 午夜视频免费 | 久草精品在线 | 夜夜爽99久久国产综合精品女不卡 | 久久久久久亚洲精品不卡 | 美女一级毛片 | 97国产在线观看 | 成人精品国产一区二区4080 | 狠狠操av| 欧美一区免费在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 在线观看免费av网站 | 久久久久国产精品 | 精品一级毛片 | 国偷自产av一区二区三区 | 欧美成人a∨高清免费观看 欧美日韩中 | 久草免费在线视频 | 日韩亚洲视频 | 久久久久国产精品午夜一区 | 狠狠涩 |