C#中怎么調(diào)用析構(gòu)方法,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)是少有的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、營銷型企業(yè)網(wǎng)站、微信小程序、手機APP,開發(fā)、制作、設(shè)計、賣鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,自2013年起,堅持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評
在向大家詳細(xì)介紹C#調(diào)用析構(gòu)方法之前,首先讓大家了解下C#中定義析構(gòu)方法,然后全面介紹C#調(diào)用析構(gòu)方法。
在C#中定義析構(gòu)方法的格式是" ~CLASS_NAME() ".非常需要注意的是,如果一個類中沒有使用到非托管資源,那么請一定不要定義析構(gòu)方法,這是因為對象執(zhí)行了析構(gòu)方法,那么"垃圾回收器"在釋放托管資源之前要先C#調(diào)用析構(gòu)方法,然后第二次才真正釋放托管資源,這樣一來,兩次刪除動作的花銷比一次大多的! (不過,即使你在類中已經(jīng)定義了析構(gòu)方法,仍然有辦法"屏蔽"它,這將在后面的代碼范例中說明) 在析構(gòu)方法中,就是用戶自己寫的釋放非托管資源的代碼段.
下面使用一段代碼來示范Dispose()方法和析構(gòu)方法如何使用:
public class ResourceHolder : System.IDisposable { public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); // 上面一行代碼作用是防止"垃圾回收器"調(diào)用這個類中的方法 // " ~ResourceHolder() " // 為什么要防止呢? 因為如果用戶記得調(diào)用Dispose()方法,那么 // "垃圾回收器"就沒有必要"多此一舉"地再去釋放一遍"非托管資源"了 // 如果用戶不記得調(diào)用呢,就讓"垃圾回收器"幫我們?nèi)?quot;多此一舉"吧 ^_^ // 你看不懂我上面說的不要緊,下面我還有更詳細(xì)的解釋呢! } protected virtual void Dispose(bool disposing) { if (disposing) { // 這里是清理"托管資源"的用戶代碼段 } // 這里是清理"非托管資源"的用戶代碼段 } ~ResourceHolder() { Dispose(false); } }
這里,我們必須要清楚,需要用戶調(diào)用的是方法Dispose()而不是方法Dispose(bool),然而,這里真正執(zhí)行釋放工作的方法卻并不是Dispose(),而是Dispose(bool) ! 為什么呢?仔細(xì)看代碼,在Dispose()中,調(diào)用了Dispose(true),而參數(shù)為"true"時,作用是清理所有的托管資源和非托管資源;大家一定還記得我前面才說過,"使用析構(gòu)方法是用來釋放非托管資源的",那么這里既然Dispose()可以完成釋放非托管資源的工作,還要析構(gòu)方法干什么呢? 其實,析構(gòu)方法的作用僅僅是一個"備份"!
嚴(yán)格地說,凡執(zhí)行了接口"IDisposable"的類,那么只要程序員在代碼中使用了這個類的對象實例,那么早晚得調(diào)用這個類的Dispose()方法,同時,如果類中含有對非托管資源的使用,那么也必須釋放非托管資源! 可惜,如果釋放非托管資源的代碼放在析構(gòu)方法中(上面的例子對應(yīng)的是 " ~ResourceHolder() "),那么程序員想調(diào)用這段釋放代碼是不可能做到的(因為析構(gòu)方法不能被用戶調(diào)用,只能被系統(tǒng),確切說是"垃圾回收器"調(diào)用),所以大家應(yīng)該知道為什么上面例子中"清理非托管資源的用戶代碼段"是在Dispose(bool)中,而不是~ResourceHolder()中! 不過不幸的是,并不是所有的程序員都時刻小心地記得調(diào)用Dispose()方法,萬一程序員忘記調(diào)用此方法,托管資源當(dāng)然沒問題,早晚會有"垃圾回收器"來回收(只不過會推遲一會兒),那么非托管資源呢?它可不受CLR的控制啊!難道它所占用的非托管資源就永遠(yuǎn)不能釋放了嗎? 當(dāng)然不是!我們還有"析構(gòu)方法"呢! 如果忘記調(diào)用Dispose(),那么"垃圾回收器"也會C#調(diào)用析構(gòu)方法來釋放非托管資源的!(多說一句廢話,如果程序員記得調(diào)用Dispose()的話,那么代碼"System.GC.SuppressFinalize(this);"則可以防止"垃圾回收器"C#調(diào)用析構(gòu)方法,這樣就不必多釋放一次"非托管資源"了) 所以我們就不怕程序員忘記調(diào)用Dispose()方法了.
所以我說了這么一大堆的理由,綜合起來只有兩點:
◆程序員們啊,千萬不要忘記調(diào)用Dispose()方法! (如果有的話o(∩_∩)o...哈哈)
◆萬一忘記,不要著急...還有救!!! 因為還有"垃圾回收器"幫我們自動C#調(diào)用析構(gòu)方法!
看完上述內(nèi)容,你們掌握C#中怎么調(diào)用析構(gòu)方法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站題目:C#中怎么調(diào)用析構(gòu)方法
當(dāng)前URL:http://chinadenli.net/article30/ppijpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站制作、App開發(fā)、營銷型網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)