C#中IDisposable的用法

來源:互聯網
上載者:User

標籤:連結   div   interface   總結   原因   ide   設計   task   虛方法   

在Net中,由GC記憶體回收線程掌握對象資源的釋放,程式員無法掌控解構函式的調用時機。對於一些非託管資源,比如資料庫連結化物件等,需要實現IDisposable介面進行手動的記憶體回收。那麼什麼時候使用Idisposable介面,以及如何使用呢?

 

一、IDisposable的介面定義如下

 

public interface IDisposable
{
    // Summary:
    //     Performs application-defined tasks associated with freeing, releasing, or
    //     resetting unmanaged resources.
    void Dispose();
}

 

二:IDisposable基本應用

 

1.定義一個實現了IDisposable介面的類

 C# 代碼   複製
public class CaryClass :IDisposable {    public void DoSomething()    {       Console.WriteLine("Do some thing....");    }    public void Dispose()    {       Console.WriteLine("及時釋放資源");    } }

 

2、兩種方式來調用

 

(1)、使用Using語句會自動調用Dispose方法

using (CaryClass caryClass = new CaryClass())

{

caryClass.DoSomething();

}

 

(2)、現實調用該介面的Dispose方法

CaryClass caryClass = new CaryClass();try{     caryClass.DoSomething();               }finally{     IDisposable disposable = caryClass as IDisposable;     if (disposable != null)         disposable.Dispose();}

 

 

三、IDisposable實現釋放資源

 C# 代碼   複製
public class DisposablClass : IDisposable{    //是否回收完畢    bool _disposed;    public void Dispose()    {        Dispose(true);             GC.SuppressFinalize(this);    }    DisposableClass()    {        Dispose(false);    }    //這裡的參數表示示是否需要釋放那些實現IDisposable介面的託管對象    protected virtual void Dispose(bool disposing)    {        if(_disposed) return; //如果已經被回收,就中斷執行        if(disposing)        {            //TODO:釋放那些實現IDisposable介面的託管對象        }        //TODO:釋放非託管資源,設定對象為null        _disposed = true;    }}

 

四、IDisposable執行個體分析

 

Dispose()方法

當需要回收非託管資源的DisposableClass類,就調用Dispoase()方法。而這個方法不會被CLR自動調用,需要手動調用。

 

DisposableClass(),解構函式

當託管堆上的對象沒有被其它對象引用,GC會在回收對象之前,調用對象的解構函式。這裡的~DisposableClass()解構函式的意義在於告訴GC你可以回收我,Dispose(false)表示在GC回收的時候,就不需要手動回收了。

 

虛方法Dispose(bool disposing)

 

1、通過此方法,所有的託管和非託管資源都能被回收。參數disposing表示是否需要釋放那些實現IDisposable介面的託管對象。

 

2、如果disposings設定為true,就表示DisposablClass類依賴某些實現了IDisposable介面的託管對象,可以通過這裡的Dispose(bool disposing)方法調用這些託管對象的Dispose()方法進行回收。

 

3、如果disposings設定為false,就表示DisposableClass類依賴某些沒有實現IDisposable的非託管資源,那就把這些非託管資來源物件設定為null,等待GC調用DisposableClass類的解構函式,把這些非託管資源進行回收。

 

4、另外,以上把Dispose(bool disposing)方法設定為protected virtual的原因是希望有子類可以一起參與到記憶體回收邏輯的設計,而且還不會影響到基類。

比如有這樣的一個子類

 

C# 代碼   複製
public class SubDisposableClass : DiposableClass{    private bool _disposed; //表示是否已經被回收    protected override void Dispose(bool disposing)    {        if(!_disposed) //如果還沒有被回收        {            if(disposiing) //如果需要回收一些託管資源            {               //TODO:回收託管資源,調用IDisposable的Dispose()方法就可以            }            //TODO:回收非託管資源,把之設定為null,等待CLR調用解構函式的時候回收            _disposed = true;        }        base.Dispose(disposing);//再調用父類的記憶體回收邏輯    }}

 

五、IDisposable總結

當我們自訂的類及其商務邏輯中引用某些託管和非託管資源,就需要實現IDisposable介面,實現對這些資來源物件的記憶體回收。

轉載自 http://www.studyofnet.com/news/590.html

C#中IDisposable的用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.