




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 protected virtual void Dispose(bool disposing if (disposing / 托管類 / 非托管資源釋放 Base( this.Dispose(false; public class Derive : Base protected override void Dispose(bool disposing if (disposing / 托管類 / 非托管資源釋放 base.Dispose(disposing; Visual Basic Public Class Base Implements IDisposable Public Overload
2、s Sub Dispose( Implements IDisposable.Dispose Me.Dispose(True GC.SuppressFinalize(Me End Sub Protected Overloads Overridable Sub Dispose(ByVal disposing As Boolean If disposing Then ' 托管類 End If ' 非托管資源釋放 End Sub Protected Overrides Sub Finalize( Me.Dispose(False MyBase.Finalize( End Sub End
3、 Class Public Class Derive Inherits Base Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean If disposing Then ' 托管類 End If ' 非托管資源釋放 MyBase.Dispose(disposing End Sub End Class 為什么要這樣設(shè)計(jì)呢?讓我在后面解說一下。現(xiàn)在我們講講實(shí)現(xiàn)這個(gè) Dispose 方法的幾個(gè)準(zhǔn) 則: 它不能扔出任何錯(cuò)誤,重復(fù)的調(diào)用也不能扔出錯(cuò)誤。也就是說,如果我已經(jīng)調(diào)用了一個(gè)對象 的 Dispos
4、e,當(dāng)我第二次調(diào)用 Dispose 的時(shí)候程序不應(yīng)該出錯(cuò),簡單地說程序在第二次調(diào)用 Dispose 時(shí)不會(huì)做任何事。這些可以通過一個(gè) flag 或多重 if 判斷實(shí)現(xiàn)。 一個(gè)對象的 Dispose 要做到釋放這個(gè)對象的所有資源。拿一個(gè)繼承類為例,繼承類中用到了 非托管資源所以它實(shí)現(xiàn)了 IDisposable 接口,如果繼承類的基類也用到了非托管資源那么基 類也得被釋放,基類的資源如何在繼承類中釋放呢?當(dāng)然是通過一個(gè) virtual/Overridable 方 法 了 , 這 樣我 們 能 保證每 個(gè) Dispose 都 被 調(diào)用到 。 這 就 是為 什 么 我們的 設(shè) 計(jì) 有 一個(gè) virtu
5、al/Overridable 的 Dispose 方法。注意我們首先要釋放繼承類的資源然后再釋放基類的資 源。 因?yàn)榉峭泄苜Y源一定要被保障正確釋放所以我們要定義一個(gè) Finalizer 來避免程序員忘了調(diào) 用 Dispose 的情況。上面的設(shè)計(jì)就采用了這種形式。如果我們手動(dòng)調(diào)用 Dispose 方法就沒有 必要再保留 Finalizer 了,所以在 Dispose 中我們用了 GC.SupressFinalize 將對象從 Finalizer 表 去掉,這樣再回收時(shí)速度會(huì)更快。 那么那個(gè) disposing 和" 托管類" 是怎么回事呢?是這樣:在 "托管類&qu
6、ot; 中寫所有你想在調(diào)用 Dispose 時(shí)讓其處于可釋放狀態(tài)的托管代碼。還記得我們說過我們不知道托管代碼是什么時(shí) 候釋放的嗎?在這里我們只是去掉成員對象的引用讓它處于可被回收狀態(tài), 并不是直接釋放 內(nèi)存。在"托管類"中這里我們也要寫上所有實(shí)現(xiàn)了 IDisposable 的成員對象,因?yàn)樗麄円灿?Dispose,所以也需要在對象的 Dispose 中調(diào)用他們的 Dispose,這樣才能保證第二個(gè)準(zhǔn)則。 disposing 是為了區(qū)分 Dispose 的調(diào)用方法,如果我們手動(dòng)調(diào)用那么為了第二個(gè)準(zhǔn)則"托管類" 部分當(dāng)然得執(zhí)行,但如果是 Finalizer
7、調(diào)用的 Dispose,這時(shí)候?qū)ο笠呀?jīng)沒有任何引用,也就 是說對象的成員自然也就不存在了(無引用) ,也就沒有必要執(zhí)行"托管類"部分了,因?yàn)樗?們已經(jīng)處于可被回收狀態(tài)了。好了,這就是 IDisposable 接口的全部了?,F(xiàn)在讓我們來回想 一下,以前我們可能認(rèn)為有了 Dispose 內(nèi)存就會(huì)馬上被釋放,這是錯(cuò)誤的。只有非托管內(nèi)存 才會(huì)被馬上釋放,托管內(nèi)存的釋放由 GC 管理,我們不用管。 -弱引用的使用 A = B,我們稱這樣的引用叫做強(qiáng)引用,GC 就是通過檢查強(qiáng)引用來決定一個(gè)對象是否是可以 回收的。另外還有一種引用稱作弱引用(WeakReference) ,這種引用不影響
8、 GC 回收,這就 是它的用處所在。你會(huì)問到底有什么用處?,F(xiàn)在我們來假設(shè)我們有一個(gè)很胖的對象,也就是 說它占用很多內(nèi)存。我們用過了這個(gè)對象,打算將它的引用去掉好讓 GC 可以回收內(nèi)存,但 是功夫不大我們又需要這個(gè)對象了,沒辦法,重新創(chuàng)建實(shí)例,怎么創(chuàng)建這么慢?。坑惺裁崔k 法解決這樣的問題?有, 將對象留在內(nèi)存中不就快了嘛! 不過我們不想這樣胖得對象總占著 內(nèi)存,而我們也不想總是創(chuàng)建這樣胖的新實(shí)例,因?yàn)檫@樣很耗時(shí)。那怎么辦?聰明的朋 友一定已經(jīng)猜到了我要說解決方法是弱引用。不錯(cuò),就是它。我們可以創(chuàng)建一個(gè)這個(gè)胖對象 的弱引用,這樣在內(nèi)存不夠時(shí) GC 可以回收,不影響內(nèi)存使用,而在沒有被 GC 回收前
9、我們 還可以再次利用該對象。這里有一個(gè)示例: C# public class Fat public int Data; public Fat(int data this.Data = data; public class Main public static void Main( Fat oFat = new Fat(1; WeakReference oFatRef = new WeakReference(oFat; / 從這里開始,F(xiàn)at 對象可以被回收了。 oFat = null; if (oFatRef.IsAlive Console.WriteLine(Fat oFatRef.Targ
10、et.Data; / 1 / 強(qiáng)制回收。 GC.Collect(; Console.WriteLine(oFatRef.IsAlive; / False Console.ReadLine(; Visual Basic Public Class Fat Public Data As Integer Public Sub New(ByVal data As Integer Me.Data = data End Sub End Class Public Module Main Sub Main( Dim oFat As New Fat(1 Dim oFatRef As New WeakReference(oFat ' 從這里開始,F(xiàn)at 對象可以被回收了。 oFat = Nothing If oFatRef.IsAlive Then Console.Write
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村垃圾糾紛調(diào)解協(xié)議書
- 企業(yè)之間放棄還款協(xié)議書
- 培訓(xùn)機(jī)構(gòu)教師培訓(xùn)協(xié)議書
- 建設(shè)工程權(quán)利保護(hù)協(xié)議書
- 二手酒店物資回收協(xié)議書
- 農(nóng)村住房保險(xiǎn)協(xié)辦協(xié)議書
- 房屋托管合同免責(zé)協(xié)議書
- 民建締結(jié)友好支部協(xié)議書
- 商場人少房租減免協(xié)議書
- 北京小區(qū)修車調(diào)解協(xié)議書
- 2025年中考時(shí)事政治題及答案
- 2025-2030全球及中國發(fā)電機(jī)租賃行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 第10課 相親相愛一家人 課件-2024-2025學(xué)年道德與法治一年級(jí)下冊統(tǒng)編版
- 山東省青島市嶗山區(qū)2024-2025學(xué)年初三下學(xué)年期末考試英語試題試卷含答案
- 2025年北京市東城區(qū)九年級(jí)初三一模語文試卷(含答案)
- 江蘇省蘇州市2025年高考仿真卷英語試卷含解析
- 遼寧英語口語試題及答案
- 2024四川成都文化旅游發(fā)展集團(tuán)有限責(zé)任公司市場化選聘中層管理人員1人筆試參考題庫附帶答案詳解
- 酒店宴會(huì)安全管理制度
- 供應(yīng)室護(hù)理業(yè)務(wù)查房
- 新華人壽保險(xiǎn)社會(huì)招聘在線測評
評論
0/150
提交評論