您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C#中IDispose模式的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
C#實現IDispose接口
.net的GC機制有兩個問題:首先GC并不能釋放所有資源,它更不能釋放非托管資源。其次,GC也不是實時的,所有GC存在不確定性。
為了解決這個問題donet提供了析構函數
public class TestClass : System.IDisposable { //供程序員顯式調用的Dispose方法 public void Dispose() { //調用帶參數的Dispose方法,釋放托管和非托管資源 Dispose(true); //手動調用了Dispose釋放資源,那么析構函數就是不必要的了,這里阻止GC調用析構函數 System.GC.SuppressFinalize(this); } //protected的Dispose方法,保證不會被外部調用。 //傳入bool值disposing以確定是否釋放托管資源 protected void Dispose(bool disposing) { if (disposing) { ///TODO:在這里加入清理"托管資源"的代碼,應該是xxx.Dispose(); } ///TODO:在這里加入清理"非托管資源"的代碼 } //供GC調用的析構函數 ~TestClass() { Dispose(false);//釋放非托管資源 } }
而即使我們忘記了在合適的時候調用Dispose,GC也會在釋放對象的時候幫我們清理非托管資源的。GC所充當的角色只是一種保障手段,它應該充當這種角色,我們不能過分依賴它。實際上,在較大的模塊退出時我們還應該及時地手動調用GC.Collect進行垃圾回收。
為什么實現IDisposable接口的類的對象,因為.net CLR是采用GC(垃圾回收器)機制管理內存,不想C++語言那樣,能保證對象的析構函數在作用域結束時被總是被自動調用,有時如果程序運行的過程中一直沒有滿足啟動GC的條件,則可能GC一次也沒啟動。 這樣,如果一個類需要占用重要資源,就應該實現IDisposable接口,或者使用另一種簡捷的方式:使用Using,如:
Using(MyClass myObj = new MyClass())
{ ... }
對于沒有實現IDisposable接口的,也就沒什么Dispose方法,但他們的Finalize同樣不能保證被調用。
Using(MyClass myObj = new MyClass())
{ ... }
是一種好方法,但是只有MyClass實現了IDisposable接口才能這樣寫.
IDispose模式在C++中用的很多,用來清理資源,而在C#里,資源分為托管和非托管兩種,托管資源是由C#的CLR幫助我們清理的,它是通過調用對象的析構函數完成的對象釋放工作,而對于非托管系統來說,則需要我們自己來釋放,例如數據庫連接對象,這就需要我們手動去調用它的Dispose()方法來實現對象它的釋放,事實上,Dispose()內容到底做了什么事,我們并不清楚,當然這就是面向對象,它不希望你關系實現的細節,呵!
對于我們開發人員來說,在了解它怎么用之后,總會對它如何實現的產生興趣,下面,我將把C#里實現IDispose模式的代碼展現出來,大家一起來學習一下,事實上,它的使用場合也很多的,當我們手動對網站,數據庫作封裝時,都會用的到,下面看一下代碼:
/// <summary> /// 實現IDisposable,對非托管系統進行資源回收 /// </summary> public class IDisplosePattern : IDisposable { public void Dispose() { this.Dispose(true);////釋放托管資源 GC.SuppressFinalize(this);//請求系統不要調用指定對象的終結器. //該方法在對象頭中設置一個位,系統在調用終結器時將檢查這個位 } protected virtual void Dispose(bool disposing) { if (!_isDisposed)//_isDisposed為false表示沒有進行手動dispose { if (disposing) { //清理托管資源 } //清理非托管資源 } _isDisposed = true; } private bool _isDisposed; ~IDisplosePattern() { this.Dispose(false);//釋放非托管資源,托管資源由終極器自己完成了 } }
通過上面的代碼,我們知道了,對于托管系統(C#的CLR為我們管理的),直接通過~IDisplosePattern()方法進行釋放,而~IDisplosePattern()這個方法何時被調用,我們是不知道的,因為它是由CLR幫助我們調用的,而我們手動進行dispose方法時,它會調用dispose(true)這個重載方法,它會幫助我們清理托管和非托管資源,如圖:
關于“C#中IDispose模式的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。