最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

析構(gòu)函數(shù) Dispose方法 Close方法
意義 銷毀對(duì)象 銷毀對(duì)象 關(guān)閉對(duì)象資源
調(diào)用方式 不能被顯示調(diào)用,在GC回收是被調(diào)用 需要顯示調(diào)用或者通過using語(yǔ)句 需要顯示調(diào)用
調(diào)用時(shí)機(jī) 不確定 確定,在顯示調(diào)用或者離開using程序塊 確定,在顯示調(diào)用時(shí)

三、析構(gòu)函數(shù) 和 Dispose 的說(shuō)明

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

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

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

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

復(fù)制代碼 代碼如下:
public class BaseResource : IDisposable
{
    //前面我們說(shuō)了析構(gòu)函數(shù)實(shí)際上是重寫了 System.Object 中的虛方法 Finalize, 默認(rèn)情況下,一個(gè)類是沒有析構(gòu)函數(shù)的,也就是說(shuō),對(duì)象被垃圾回收時(shí)不會(huì)被調(diào)用Finalize方法  
    ~BaseResource()
    {
        // 為了保持代碼的可讀性性和可維護(hù)性,千萬(wàn)不要在這里寫釋放非托管資源的代碼  
        // 必須以Dispose(false)方式調(diào)用,以false告訴Dispose(bool disposing)函數(shù)是從垃圾回收器在調(diào)用Finalize時(shí)調(diào)用的  
        Dispose(false);
    }
    // 無(wú)法被客戶直接調(diào)用  
    // 如果 disposing 是 true, 那么這個(gè)方法是被客戶直接調(diào)用的,那么托管的,和非托管的資源都可以釋放  
    // 如果 disposing 是 false, 那么函數(shù)是從垃圾回收器在調(diào)用Finalize時(shí)調(diào)用的,此時(shí)不應(yīng)當(dāng)引用其他托管對(duì)象所以,只能釋放非托管資源  
    protected virtual void Dispose(bool disposing)
    {
        // 那么這個(gè)方法是被客戶直接調(diào)用的,那么托管的,和非托管的資源都可以釋放  
        if (disposing)
        {
            // 釋放 托管資源  
            OtherManagedObject.Dispose();
        }
        //釋放非托管資源  
        DoUnManagedObjectDispose();
        // 那么這個(gè)方法是被客戶直接調(diào)用的,告訴垃圾回收器從Finalization隊(duì)列中清除自己,從而阻止垃圾回收器調(diào)用Finalize方法.  
        if (disposing)
            GC.SuppressFinalize(this);
    }
    //可以被客戶直接調(diào)用  
    public void Dispose()
    {
        //必須以Dispose(true)方式調(diào)用,以true告訴Dispose(bool disposing)函數(shù)是被客戶直接調(diào)用的  
        Dispose(true);
    }
}

上面的范例達(dá)到的目的:

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

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

最后:

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

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

相關(guān)文章

最新評(píng)論

法库县| 海宁市| 全南县| 灵石县| 凤冈县| 资兴市| 延安市| 潞西市| 花莲市| 凤庆县| 修武县| 伽师县| 潼关县| 商水县| 霍邱县| 石嘴山市| 边坝县| 西平县| 青岛市| 台南县| 炎陵县| 福泉市| 庄浪县| 扶沟县| 大冶市| 卢湾区| 玉溪市| 双柏县| 咸阳市| 六枝特区| 鄯善县| 武威市| 西城区| 镇坪县| 从江县| 大埔县| 灵武市| 汕头市| 闽侯县| 永寿县| 汉川市|