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接口才能這樣寫.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM