欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中析構函數(shù)、Dispose、Close方法的區(qū)別

 更新時間:2016年04月15日 09:08:36   作者:側步投籃  
本文詳細對比了C#中析構函數(shù)、Dispose和Close方法的區(qū)別,三者都是釋放資源,本文介紹了他們各自的使用方法和使用場景,希望對大家有所幫助。

一、Close與Dispose這兩種方法的區(qū)別

調用完了對象的Close方法后,此對象有可能被重新進行使用;而Dispose方法來說,此對象所占有的資源需要被標記為無用了,也就是此對象要被銷毀,不能再被使用。例如常見.Net類庫中的SqlConnection這個類,當調用完Close方法后,可以通過Open重新打開一個數(shù)據(jù)庫連接,當徹底不用這個對象了就可以調用Dispose方法來標記此對象無用,等待GC回收。

二、三者的區(qū)別如圖

析構函數(shù) Dispose方法 Close方法
意義 銷毀對象 銷毀對象 關閉對象資源
調用方式 不能被顯示調用,在GC回收是被調用 需要顯示調用或者通過using語句 需要顯示調用
調用時機 不確定 確定,在顯示調用或者離開using程序塊 確定,在顯示調用時

三、析構函數(shù) 和 Dispose 的說明

Dispose需要實現(xiàn)IDisposable接口。 
Dispose由開發(fā)人員代碼調用,而析構函數(shù)由GC自動調用。
Dispose方法應釋放所有托管和非托管資源。而析構函數(shù)只應釋放非托管資源。因為析構函數(shù)由GC來判斷調用,當GC判斷某個對象不再需要的時候,則調用其析構方法,這時候該對象中可能還包含有其他有用的托管資源。
Dispose方法結尾處加上代碼“GC.SuppressFinalize(this);”,即告訴GC不需要再調用該對象的析構方法,否則,GC仍會在判斷該對象不再有用后調用其析構方法,雖然程序不會出錯,但影響系統(tǒng)性能。
析構函數(shù) 和 Dispose 釋放的資源應該相同,這樣即使類使用者在沒有調用 Dispose 的情況下,資源也會在 Finalize 中得到釋放。
Finalize 不應為 public。
通過系統(tǒng)GC頻繁的調用析構方法來釋放資源會降低系統(tǒng)性能,所以推薦顯示調用Dispose方法。
有 Dispose 方法存在時,應該調用它,因為 Finalize 釋放資源通常是很慢的。

四、Close函數(shù)的說明

Close 這個方法在不同的類中有不同的含義,并沒有任何規(guī)定要求 Close 具有特殊的含義,也就是說 Close 并不一定要釋放資源,您也可以讓 Close 方法表示“關門”。  不過,由于 Close 有“關”的意思,通常也把 Close 拿來釋放資源,這也是允許的。比如文件操作中,用 Close 釋放對象似乎比 Dispose 含義更準確,于是在設計類時,可以將 Close 設為 public,將 Dispose 設為 protected,然后由 Close 調用 Dispose。 也就是說 Close 表示什么意思,它會不會釋放資源,完全由類設計者決定。網(wǎng)上說“Close 調用 Dispose”這種方法是很片面的。在 SqlConnection 中 Close 只是表示關閉數(shù)據(jù)庫連接,并沒有釋放 SqlConnection 這個對象資源。   根據(jù)經(jīng)驗,Close 和 Dispose 同時存在的情況下(均為 public),Close 并不表示釋放資源,因為通常情況下,類設計者不應該使用兩個 public 方法來釋放相同的資源。

五、析構函數(shù)和Dispose方法實例

復制代碼 代碼如下:
public class BaseResource : IDisposable
{
    //前面我們說了析構函數(shù)實際上是重寫了 System.Object 中的虛方法 Finalize, 默認情況下,一個類是沒有析構函數(shù)的,也就是說,對象被垃圾回收時不會被調用Finalize方法  
    ~BaseResource()
    {
        // 為了保持代碼的可讀性性和可維護性,千萬不要在這里寫釋放非托管資源的代碼  
        // 必須以Dispose(false)方式調用,以false告訴Dispose(bool disposing)函數(shù)是從垃圾回收器在調用Finalize時調用的  
        Dispose(false);
    }
    // 無法被客戶直接調用  
    // 如果 disposing 是 true, 那么這個方法是被客戶直接調用的,那么托管的,和非托管的資源都可以釋放  
    // 如果 disposing 是 false, 那么函數(shù)是從垃圾回收器在調用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)函數(shù)是被客戶直接調用的  
        Dispose(true);
    }
}

上面的范例達到的目的:

1/ 如果客戶沒有調用Dispose(),未能及時釋放托管和非托管資源,那么在垃圾回收時,還有機會執(zhí)行Finalize(),釋放非托管資源,但是造成了非托管資源的未及時釋放的空閑浪費

2/ 如果客戶調用了Dispose(),就能及時釋放了托管和非托管資源,那么該對象被垃圾回收時,不回執(zhí)行Finalize(),提高了非托管資源的使用效率并提升了系統(tǒng)性能

最后:

如果您的類中使用了非托管資源,則要考慮提供Close方法,和Open方法。并在您的Dispose方法中先調用 Close方法。

在使用已經(jīng) 有類時,如SqlConnection。如果暫時不用這個連接,可以考慮用Close()方法。如果不用了就考慮調用Dispose()方法。

相關文章

  • C# 線程同步詳解

    C# 線程同步詳解

    本文主要介紹了C#中線程同步的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • C#使用代碼實現(xiàn)春晚撲克牌魔術

    C#使用代碼實現(xiàn)春晚撲克牌魔術

    這篇文章主要為大家詳細介紹了C#如何使用代碼實現(xiàn)龍年春晚撲克牌魔術(守歲共此時),文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2024-02-02
  • c#編寫的高并發(fā)數(shù)據(jù)庫控制訪問代碼

    c#編寫的高并發(fā)數(shù)據(jù)庫控制訪問代碼

    往往大數(shù)據(jù)量,高并發(fā)時, 瓶頸都在數(shù)據(jù)庫上, 好多人都說用數(shù)據(jù)庫的復制,發(fā)布, 讀寫分離等技術, 但主從數(shù)據(jù)庫之間同步時間有延遲.
    2015-03-03
  • C#調用js庫的方法小結

    C#調用js庫的方法小結

    本文主要介紹了C#調用js庫的方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C# 腳本引擎RulesEngine的使用詳解

    C# 腳本引擎RulesEngine的使用詳解

    這篇文章主要介紹了C# 腳本引擎RulesEngine的使用方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • 淺談C#數(shù)組(一)

    淺談C#數(shù)組(一)

    本篇文章小編要得大家介紹的是C#數(shù)組,數(shù)組是一種數(shù)據(jù)結構,它可以包含同一個類型的多個元素,如果需要使用同一類型的多個對象,可以使用數(shù)組和集合,需要的朋友可以參考下面文章的具體內容
    2021-09-09
  • Unity實現(xiàn)鼠標點2D轉3D進行旋轉

    Unity實現(xiàn)鼠標點2D轉3D進行旋轉

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)鼠標點2D轉3D進行旋轉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • SQL+C#實現(xiàn)獲得當前月的第一天與最后一天

    SQL+C#實現(xiàn)獲得當前月的第一天與最后一天

    本文分享了SQL+C#獲得當前月的第一天與最后一天的代碼實例,代碼簡潔,適合初學者參考。需要的朋友可以看下
    2016-12-12
  • C# 判斷字符串第一位是否為數(shù)字

    C# 判斷字符串第一位是否為數(shù)字

    C# 判斷字符串第一位是否為數(shù)字,需要的朋友可以參考一下
    2013-04-04
  • C#使用zxing/zbar/thoughtworkQRcode解析二維碼的示例代碼

    C#使用zxing/zbar/thoughtworkQRcode解析二維碼的示例代碼

    zxing是谷歌開源的二維碼庫,zbar,thoughtworkQRcode也是開源的,三者之間比較各有優(yōu)劣,本文將通過一個案例demo源碼,帶來認識學習下這三者的實際解碼效果,感興趣的可以了解一下
    2023-07-07

最新評論