91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么調用析構方法

發布時間:2021-07-08 14:59:04 來源:億速云 閱讀:426 作者:Leah 欄目:編程語言

C#中怎么調用析構方法,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

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

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

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

public class ResourceHolder : System.IDisposable  {  public void Dispose()  {  Dispose(true);   System.GC.SuppressFinalize(this);  // 上面一行代碼作用是防止"垃圾回收器"調用這個類中的方法  // " ~ResourceHolder() "  // 為什么要防止呢? 因為如果用戶記得調用Dispose()方法,那么  // "垃圾回收器"就沒有必要"多此一舉"地再去釋放一遍"非托管資源"了  // 如果用戶不記得調用呢,就讓"垃圾回收器"幫我們去"多此一舉"吧 ^_^  // 你看不懂我上面說的不要緊,下面我還有更詳細的解釋呢!  }   protected virtual void Dispose(bool disposing)  {  if (disposing)  {  // 這里是清理"托管資源"的用戶代碼段  }  // 這里是清理"非托管資源"的用戶代碼段  }   ~ResourceHolder()  {  Dispose(false);  }  }

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

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

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

看完上述內容,你們掌握C#中怎么調用析構方法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洛川县| 平度市| 霞浦县| 和林格尔县| 临沂市| 蓬溪县| 禄丰县| 广南县| 岑巩县| 陕西省| 泾阳县| 长沙市| 陆川县| 诸城市| 通河县| 阿克陶县| 阳东县| 洱源县| 肇东市| 宜阳县| 泾川县| 东乌珠穆沁旗| 西安市| 唐海县| 扎赉特旗| 青田县| 始兴县| 平江县| 兴山县| 梅州市| 措美县| 广饶县| 怀仁县| 大宁县| 潼关县| 金堂县| 丹阳市| 应用必备| 内江市| 深泽县| 英山县|