日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接口IDisposable的用法

發(fā)布時間:2023/12/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接口IDisposable的用法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  C#的每一個類型都代表一種資源,而資源又分為兩類:

  • 托管資源? 由CLR管理分配和釋放的資源,即從CLR里new出來的對象。
  • 非托管資源? 不受CLR管理的對象,如Windows內(nèi)核對象,或者文件、數(shù)據(jù)庫連接、套接字、COM對象等。

  如果類型用到了非托管資源,或者需要顯式釋放托管資源,那么需要讓類型繼承接口IDisposable。記住:如果類型需要顯式釋放資源,那么一定要繼承IDisposable接口。如:

class SampleClass:IDisposable {private IntPtr nativeResource = Marshal.AllocHGlobal(100);//非托管資源private Bitmap bitmap = new Bitmap(100, 100);//托管資源private bool isDisposed = false;//實現(xiàn)IDisposable中的Dispose方法public void Dispose( ){Dispose(true);GC.SuppressFinalize(this);//通知垃圾回收器不用再調(diào)用終結(jié)器 }//不必要的方法,只是為了符合其他語言的規(guī)范public void Close(){Dispose();}//必須的,防止程序員忘記顯示調(diào)用Dispose方法(隱式清理)~SampleClass(){Dispose(false);}//非密封類修飾用protected virtual,提醒子類必須實現(xiàn)自己的清理方法時注意到父類的清理工作protected virtual void Dispose(bool isDisposing){if(isDisposed){return;}if(isDisposing){//清理托管資源if(bitmap != null){bitmap.Dispose();bitmap = null;}}//清理非托管資源if(nativeResource!=IntPtr.Zero){Marshal.FreeHGlobal(nativeResource);nativeResource = IntPtr.Zero;}isDisposed = false;}public void SamplePublicMethod(){if(isDisposed){throw new ObjectDisposedException("SampleClass", "SampleClass is disposed");}//代碼 } } View Code

  繼承IDisposable接口,可以使用using語法糖。在using語句代碼塊內(nèi),可以使用聲明的對象,當語句離開代碼塊后,系統(tǒng)自動釋放資源:

//使用using方法,當語句離開代碼塊后,using內(nèi)的對象自動釋放 using (SampleClass sample = new SampleClass()) {//…… } //以上代碼相當于下面的代碼 SampleClass sample0 = new SampleClass(); try {//…… } finally {sample0.Dispose(); } View Code

  在SampleClass中,存在一個終結(jié)器(C++中叫析構(gòu)器)。其意義在于,調(diào)用者可能并不會主動調(diào)用Dispose方法,而終結(jié)器會被垃圾回收器調(diào)用調(diào)用,所以它作為釋放資源的補救措施。

  在CLR中,每new一個對象時,就會為該對象在堆上分配內(nèi)存,如果不再被引用,就會回收它們的內(nèi)存。如果沒有實現(xiàn)IDisposable接口的類型對象,垃圾回收器會直接釋放對象所占內(nèi)存;如果實現(xiàn)了,每次創(chuàng)建對象時,CLR會將該對象的一個指針放到終結(jié)列表中,垃圾回收器在回收對象前會首先將終結(jié)列表中的指針放入一個freachable隊列。同時,CLR會分配一個線程管理freachable隊列,調(diào)用對象終結(jié)器,只有此時,對象才會被真正標識為垃圾,并在下一次進行垃圾回收時釋放對象所占內(nèi)存。即:實現(xiàn)IDisposable接口的類型,至少要經(jīng)過兩次垃圾回收才能真正釋放掉內(nèi)存。其中Dispose方法中的GC.SuppressFinalize()方法用于在顯示釋放資源后,通知垃圾回收器不用再調(diào)用終結(jié)器(隱式回收)釋放資源。

  在實現(xiàn)IDisposable接口時,其Dispose()方法并沒有做實際的清理工作,但提供了帶bool參數(shù)的受保護的虛方法。因為該類型可能被其他類繼承,如果子類實現(xiàn)自己的Dispose模式,受保護的虛方法可以提醒子類:在實現(xiàn)自己的清理方法時,需要注意父類的清理工作(base.Dispose方法)。

  真正撰寫資源釋放代碼的虛方法有一個bool參數(shù),但是在顯示釋放資源(true)與隱式釋放資源(false)調(diào)用中傳入的參數(shù)不同。表明:隱式清理時,只需要處理非托管資源就行。托管資源中的普通類型不需要手動清理,而非普通類型需要手動清理。

  Dispose模式設(shè)計思路:如果調(diào)用者顯示調(diào)用了Dispose方法,那么類型按部就班釋放自己的全部資源,然后通知垃圾回收器不需要再釋放(GC.SuppressFinalize()方法);而忘記調(diào)用Dispose方法,那么類型就假定自己的所有托管資源會全部交給垃圾回收器回收,不需要手動清理。

轉(zhuǎn)載于:https://www.cnblogs.com/pilgrim/p/9276930.html

總結(jié)

以上是生活随笔為你收集整理的接口IDisposable的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。