基礎才(cai)是重(zhong)中之重(zhong)~C#中標準的(de)IDispose模式
IDispose模式在C++中用(yong)的(de)(de)(de)很多(duo),用(yong)來(lai)清理(li)資(zi)源,而在C#里(li),資(zi)源分為托(tuo)管和非托(tuo)管兩種,托(tuo)管資(zi)源是(shi)由C#的(de)(de)(de)CLR幫助(zhu)我(wo)(wo)們(men)清理(li)的(de)(de)(de),它(ta)是(shi)通過(guo)調(diao)用(yong)對(dui)象(xiang)的(de)(de)(de)析構(gou)函(han)數完成的(de)(de)(de)對(dui)象(xiang)釋(shi)放(fang)工(gong)作,而對(dui)于非托(tuo)管系(xi)統(tong)來(lai)說(shuo),則(ze)需要(yao)我(wo)(wo)們(men)自(zi)己來(lai)釋(shi)放(fang),例如數據庫連接對(dui)象(xiang),這就(jiu)需要(yao)我(wo)(wo)們(men)手(shou)動去調(diao)用(yong)它(ta)的(de)(de)(de)Dispose()方(fang)法來(lai)實(shi)現(xian)對(dui)象(xiang)它(ta)的(de)(de)(de)釋(shi)放(fang),事實(shi)上,Dispose()內容(rong)到底做(zuo)了(le)什么事,我(wo)(wo)們(men)并不清楚,當然這就(jiu)是(shi)面向對(dui)象(xiang),它(ta)不希望(wang)你關(guan)系(xi)實(shi)現(xian)的(de)(de)(de)細節,呵!
對于我們(men)開發人員來(lai)(lai)說,在了解它(ta)怎么用(yong)(yong)之后,總會對它(ta)如(ru)何實現(xian)的產生(sheng)興(xing)趣,下面(mian),我將把C#里實現(xian)IDispose模式的代碼展現(xian)出來(lai)(lai),大家一起來(lai)(lai)學習一下,事實上,它(ta)的使用(yong)(yong)場合也很多(duo)的,當我們(men)手動對網(wang)站,數據庫作封裝(zhuang)時,都會用(yong)(yong)的到,下面(mian)看一下代碼:
/// <summary> /// 實現(xian)IDisposable,對非托(tuo)管系統進行(xing)資(zi)源回(hui)收 /// </summary> public class IDisplosePattern : IDisposable { public void Dispose() { this.Dispose(true);////釋(shi)放托(tuo)管資源 GC.SuppressFinalize(this);//請求(qiu)系統不要調用(yong)指(zhi)定(ding)對象的終結器(qi). //該方(fang)法在對(dui)象頭中(zhong)設(she)置一個(ge)位(wei),系統在調用(yong)終(zhong)結(jie)器時將檢(jian)查這個(ge)位(wei) } protected virtual void Dispose(bool disposing) { if (!_isDisposed)//_isDisposed為false表示沒有進行手(shou)動dispose { if (disposing) { //清理托管資源 } //清(qing)理非托管(guan)資(zi)源 } _isDisposed = true; } private bool _isDisposed; ~IDisplosePattern() { this.Dispose(false);//釋放(fang)非(fei)托管(guan)資源,托管(guan)資源由終(zhong)極器自己(ji)完(wan)成了 } }
通過上面的代碼,我們知道了,對于托管系統(C#的CLR為我們管理的),直接通過~IDisplosePattern()方法進行釋放,而~IDisplosePattern()這(zhe)個方(fang)法(fa)(fa)何時被調用(yong),我(wo)們(men)是(shi)不(bu)知道的,因為它(ta)是(shi)由CLR幫(bang)(bang)助(zhu)我(wo)們(men)調用(yong)的,而我(wo)們(men)手動進行dispose方(fang)法(fa)(fa)時,它(ta)會調用(yong)dispose(true)這(zhe)個重載方(fang)法(fa)(fa),它(ta)會幫(bang)(bang)助(zhu)我(wo)們(men)清理托(tuo)(tuo)管和非托(tuo)(tuo)管資(zi)源,如圖: