這篇文章將為大家詳細(xì)講解有關(guān)C#中IDispose模式的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、宜黃網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為宜黃等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
C#實(shí)現(xiàn)IDispose接口
.net的GC機(jī)制有兩個(gè)問題:首先GC并不能釋放所有資源,它更不能釋放非托管資源。其次,GC也不是實(shí)時(shí)的,所有GC存在不確定性。
為了解決這個(gè)問題donet提供了析構(gòu)函數(shù)
public class TestClass : System.IDisposable { //供程序員顯式調(diào)用的Dispose方法 public void Dispose() { //調(diào)用帶參數(shù)的Dispose方法,釋放托管和非托管資源 Dispose(true); //手動調(diào)用了Dispose釋放資源,那么析構(gòu)函數(shù)就是不必要的了,這里阻止GC調(diào)用析構(gòu)函數(shù) System.GC.SuppressFinalize(this); } //protected的Dispose方法,保證不會被外部調(diào)用。 //傳入bool值disposing以確定是否釋放托管資源 protected void Dispose(bool disposing) { if (disposing) { ///TODO:在這里加入清理"托管資源"的代碼,應(yīng)該是xxx.Dispose(); } ///TODO:在這里加入清理"非托管資源"的代碼 } //供GC調(diào)用的析構(gòu)函數(shù) ~TestClass() { Dispose(false);//釋放非托管資源 } }
而即使我們忘記了在合適的時(shí)候調(diào)用Dispose,GC也會在釋放對象的時(shí)候幫我們清理非托管資源的。GC所充當(dāng)?shù)慕巧皇且环N保障手段,它應(yīng)該充當(dāng)這種角色,我們不能過分依賴它。實(shí)際上,在較大的模塊退出時(shí)我們還應(yīng)該及時(shí)地手動調(diào)用GC.Collect進(jìn)行垃圾回收。
為什么實(shí)現(xiàn)IDisposable接口的類的對象,因?yàn)?net CLR是采用GC(垃圾回收器)機(jī)制管理內(nèi)存,不想C++語言那樣,能保證對象的析構(gòu)函數(shù)在作用域結(jié)束時(shí)被總是被自動調(diào)用,有時(shí)如果程序運(yùn)行的過程中一直沒有滿足啟動GC的條件,則可能GC一次也沒啟動。 這樣,如果一個(gè)類需要占用重要資源,就應(yīng)該實(shí)現(xiàn)IDisposable接口,或者使用另一種簡捷的方式:使用Using,如:
Using(MyClass myObj = new MyClass())
{ ... }
對于沒有實(shí)現(xiàn)IDisposable接口的,也就沒什么Dispose方法,但他們的Finalize同樣不能保證被調(diào)用。
Using(MyClass myObj = new MyClass())
{ ... }
是一種好方法,但是只有MyClass實(shí)現(xiàn)了IDisposable接口才能這樣寫.
IDispose模式在C++中用的很多,用來清理資源,而在C#里,資源分為托管和非托管兩種,托管資源是由C#的CLR幫助我們清理的,它是通過調(diào)用對象的析構(gòu)函數(shù)完成的對象釋放工作,而對于非托管系統(tǒng)來說,則需要我們自己來釋放,例如數(shù)據(jù)庫連接對象,這就需要我們手動去調(diào)用它的Dispose()方法來實(shí)現(xiàn)對象它的釋放,事實(shí)上,Dispose()內(nèi)容到底做了什么事,我們并不清楚,當(dāng)然這就是面向?qū)ο?,它不希望你關(guān)系實(shí)現(xiàn)的細(xì)節(jié),呵!
對于我們開發(fā)人員來說,在了解它怎么用之后,總會對它如何實(shí)現(xiàn)的產(chǎn)生興趣,下面,我將把C#里實(shí)現(xiàn)IDispose模式的代碼展現(xiàn)出來,大家一起來學(xué)習(xí)一下,事實(shí)上,它的使用場合也很多的,當(dāng)我們手動對網(wǎng)站,數(shù)據(jù)庫作封裝時(shí),都會用的到,下面看一下代碼:
////// 實(shí)現(xiàn)IDisposable,對非托管系統(tǒng)進(jìn)行資源回收 /// public class IDisplosePattern : IDisposable { public void Dispose() { this.Dispose(true);////釋放托管資源 GC.SuppressFinalize(this);//請求系統(tǒng)不要調(diào)用指定對象的終結(jié)器. //該方法在對象頭中設(shè)置一個(gè)位,系統(tǒng)在調(diào)用終結(jié)器時(shí)將檢查這個(gè)位 } protected virtual void Dispose(bool disposing) { if (!_isDisposed)//_isDisposed為false表示沒有進(jìn)行手動dispose { if (disposing) { //清理托管資源 } //清理非托管資源 } _isDisposed = true; } private bool _isDisposed; ~IDisplosePattern() { this.Dispose(false);//釋放非托管資源,托管資源由終極器自己完成了 } }
通過上面的代碼,我們知道了,對于托管系統(tǒng)(C#的CLR為我們管理的),直接通過~IDisplosePattern()方法進(jìn)行釋放,而~IDisplosePattern()這個(gè)方法何時(shí)被調(diào)用,我們是不知道的,因?yàn)樗怯蒀LR幫助我們調(diào)用的,而我們手動進(jìn)行dispose方法時(shí),它會調(diào)用dispose(true)這個(gè)重載方法,它會幫助我們清理托管和非托管資源,如圖:
關(guān)于“C#中IDispose模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。