程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中析構函數、Dispose、Close辦法的差別

C#中析構函數、Dispose、Close辦法的差別

編輯:C#入門知識

C#中析構函數、Dispose、Close辦法的差別。本站提示廣大學習愛好者:(C#中析構函數、Dispose、Close辦法的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中析構函數、Dispose、Close辦法的差別正文


1、Close與Dispose這兩種辦法的差別

挪用完了對象的Close辦法後,此對象有能夠被從新停止應用;而Dispose辦法來講,此對象所占領的資本須要被標志為無用了,也就是此對象要被燒毀,不克不及再被應用。例如罕見.Net類庫中的SqlConnection這個類,當挪用完Close辦法後,可以經由過程Open從新翻開一個數據庫銜接,當完全不消這個對象了便可以挪用Dispose辦法來標志此對象無用,期待GC收受接管。

2、三者的差別如圖

析構函數 Dispose辦法 Close辦法 意義 燒毀對象 燒毀對象 封閉對象資本 挪用方法 不克不及被顯示挪用,在GC收受接管是被挪用 須要顯示挪用或許經由過程using語句 須要顯示挪用 挪用機會 不肯定 肯定,在顯示挪用或許分開using法式塊 肯定,在顯示挪用時

3、析構函數 和 Dispose 的解釋

Dispose須要完成IDisposable接口。 
Dispose由開辟人員代碼挪用,而析構函數由GC主動挪用。
Dispose辦法應釋放一切托管和非托管資本。而析構函數只應釋放非托管資本。由於析構函數由GC來斷定挪用,當GC斷定某個對象不再須要的時刻,則挪用其析構辦法,這時候候該對象中能夠還包括有其他有效的托管資本。
Dispose辦法開頭處加上代碼“GC.SuppressFinalize(this);”,即告知GC不須要再挪用該對象的析構辦法,不然,GC仍會在斷定該對象不再有效後挪用其析構辦法,固然法式不會失足,但影響體系機能。
析構函數 和 Dispose 釋放的資本應當雷同,如許即便類應用者在沒有挪用 Dispose 的情形下,資本也會在 Finalize 中獲得釋放。
Finalize 不該為 public。
經由過程體系GC頻仍的挪用析構辦法來釋放資本會下降體系機能,所以推舉顯示挪用Dispose辦法。
有 Dispose 辦法存在時,應當挪用它,由於 Finalize 釋放資本平日是很慢的。

4、Close函數的解釋

Close 這個辦法在分歧的類中有分歧的寄義,並沒有任何劃定請求 Close 具有特別的寄義,也就是說 Close 其實不必定要釋放資本,您也能夠讓 Close 辦法表現“關門”。  不外,因為 Close 有“關”的意思,平日也把 Close 拿來釋放資本,這也是許可的。好比文件操作中,用 Close 釋放對象仿佛比 Dispose 寄義更精確,因而在設計類時,可以將 Close 設為 public,將 Dispose 設為 protected,然後由 Close 挪用 Dispose。 也就是說 Close 表現甚麼意思,它會不會釋放資本,完整由類設計者決議。網上說“Close 挪用 Dispose”這類辦法是很單方面的。在 SqlConnection 中 Close 只是表現封閉數據庫銜接,並沒有釋放 SqlConnection 這個對象資本。   依據經歷,Close 和 Dispose 同時存在的情形下(均為 public),Close 其實不表現釋放資本,由於平日情形下,類設計者不該該應用兩個 public 辦法來釋放雷同的資本。

5、析構函數和Dispose辦法實例

public class BaseResource : IDisposable
{
    //後面我們說了析構函數現實上是重寫了 System.Object 中的虛辦法 Finalize, 默許情形下,一個類是沒有析構函數的,也就是說,對象被渣滓收受接管時不會被挪用Finalize辦法  
    ~BaseResource()
    {
        // 為了堅持代碼的可讀性性和可保護性,萬萬不要在這裡寫釋放非托管資本的代碼  
        // 必需以Dispose(false)方法挪用,以false告知Dispose(bool disposing)函數是從渣滓收受接管器在挪用Finalize時挪用的  
        Dispose(false);
    }
    // 沒法被客戶直接挪用  
    // 假如 disposing 是 true, 那末這個辦法是被客戶直接挪用的,那末托管的,和非托管的資本都可以釋放  
    // 假如 disposing 是 false, 那末函數是從渣滓收受接管器在挪用Finalize時挪用的,此時不該當援用其他托管對象所以,只能釋放非托管資本  
    protected virtual void Dispose(bool disposing)
    {
        // 那末這個辦法是被客戶直接挪用的,那末托管的,和非托管的資本都可以釋放  
        if (disposing)
        {
            // 釋放 托管資本  
            OtherManagedObject.Dispose();
        }
        //釋放非托管資本  
        DoUnManagedObjectDispose();
        // 那末這個辦法是被客戶直接挪用的,告知渣滓收受接管器從Finalization隊列中消除本身,從而阻攔渣滓收受接管器挪用Finalize辦法.  
        if (disposing)
            GC.SuppressFinalize(this);
    }
    //可以被客戶直接挪用  
    public void Dispose()
    {
        //必需以Dispose(true)方法挪用,以true告知Dispose(bool disposing)函數是被客戶直接挪用的  
        Dispose(true);
    }
}

下面的典范到達的目標:

1/ 假如客戶沒有挪用Dispose(),未能實時釋放托管和非托管資本,那末在渣滓收受接管時,還無機會履行Finalize(),釋放非托管資本,然則形成了非托管資本的未實時釋放的余暇糟蹋

2/ 假如客戶挪用了Dispose(),就可以實時釋放了托管和非托管資本,那末該對象被渣滓收受接管時,不回履行Finalize(),進步了非托管資本的應用效力並晉升了體系機能

最初:

假如您的類中應用了非托管資本,則要斟酌供給Close辦法,和Open辦法。並在您的Dispose辦法中先挪用 Close辦法。

在應用曾經 有類時,如SqlConnection。假如臨時不消這個銜接,可以斟酌用Close()辦法。假如不消了就斟酌挪用Dispose()辦法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved