日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C#中的Finalize,Dispose,SuppressFinalize的實(shí)現(xiàn)和使用介紹

 印度阿三17 2019-08-19

原文地址:http://www./csharpspace/8927r1397.shtml

MSDN建議按照下面的模式實(shí)現(xiàn)IDisposable接口:

復(fù)制代碼
 1 public class Foo: IDisposable
 2 {
 3     public void Dispose()
 4     {
 5         Dispose(true);
 6         GC.SuppressFinalize(this);
 7     }
 8 
 9     protected virtual void Dispose(bool disposing)
10     {
11         if (!m_disposed)
12         {
13             if (disposing)
14             {
15                 // Release managed resources
16             }
17             // Release unmanaged resources
18             m_disposed = true;
19         }
20     }
21 
22     ~Foo()
23     {
24         Dispose(false);
25     }
26     private bool m_disposed;
27 } 
復(fù)制代碼

?

在.NET的對(duì)象中實(shí)際上有兩個(gè)用于釋放資源的函數(shù):Dispose和Finalize。Finalize的目的是用于釋放非托管的資源,而Dispose是用于釋放所有資源,包括托管的和非托管的。

在這個(gè)模式中,void Dispose(bool disposing)函數(shù)通過一個(gè)disposing參數(shù)來(lái)區(qū)別當(dāng)前是否是被Dispose()調(diào)用。如果是被Dispose()調(diào)用,那么需要同時(shí)釋放 托管和非托管的資源。如果是被~Foo()(也就是C#的Finalize())調(diào)用了,那么只需要釋放非托管的資源即可。

這是因?yàn)?,Dispose()函數(shù)是被其它代碼顯式調(diào)用并要求釋放資源的,而Finalize是被GC調(diào)用的。在GC調(diào)用的時(shí)候Foo所引用的其它 托管對(duì)象可能還不需要被銷毀,并且即使要銷毀,也會(huì)由GC來(lái)調(diào)用。因此在Finalize中只需要釋放非托管資源即可。另外一方面,由于在 Dispose()中已經(jīng)釋放了托管和非托管的資源,因此在對(duì)象被GC回收時(shí)再次調(diào)用Finalize是沒有必要的,所以在Dispose()中調(diào)用 GC.SuppressFinalize(this)避免重復(fù)調(diào)用Finalize。

然而,即使重復(fù)調(diào)用Finalize和Dispose也是不存在問題的,因?yàn)橛凶兞縨_disposed的存在,資源只會(huì)被釋放一次,多余的調(diào)用會(huì)被忽略過去。

因此,上面的模式保證了:

1、 Finalize只釋放非托管資源;

2、 Dispose釋放托管和非托管資源;

3、 重復(fù)調(diào)用Finalize和Dispose是沒有問題的;

4、 Finalize和Dispose共享相同的資源釋放策略,因此他們之間也是沒有沖突的。

在C#中,這個(gè)模式需要顯式地實(shí)現(xiàn),其中C#的~Foo()函數(shù)代表了Finalize()。而在C /CLI中,這個(gè)模式是自動(dòng)實(shí)現(xiàn)的,C 的類析構(gòu)函數(shù)則是不一樣的。

按照C 語(yǔ)義,析構(gòu)函數(shù)在超出作用域,或者delete的時(shí)候被調(diào)用。在Managed C (即.NET 1.1中的托管C )中,析構(gòu)函數(shù)相當(dāng)于CLR中的Finalize()方法,在垃圾收集的時(shí)候由GC調(diào)用,因此,調(diào)用的時(shí)機(jī)是不明確的。在.NET 2.0的C /CLI中,析構(gòu)函數(shù)的語(yǔ)義被修改為等價(jià)與Dispose()方法,這就隱含了兩件事情:

1、 所有的C /CLI中的CLR類都實(shí)現(xiàn)了接口IDisposable,因此在C#中可以用using關(guān)鍵字來(lái)訪問這個(gè)類的實(shí)例。

2、 析構(gòu)函數(shù)不再等價(jià)于Finalize()了。

?

----------------------------------以下是CSDN上一位高手的總結(jié)----------------------------------------------

1、Finalize方法(C#中是析構(gòu)函數(shù),以下稱析構(gòu)函數(shù))是用于釋放非托管資源的,而托管資源會(huì)由GC自動(dòng)回收。所以,我們也可以這樣來(lái)區(qū)分 托管和非托管資源。所有會(huì)由GC自動(dòng)回收的資源,就是托管的資源,而不能由GC自動(dòng)回收的資源,就是非托管資源。在我們的類中直接使用非托管資源的情況很 少,所以基本上不用我們寫析構(gòu)函數(shù)。?
2、大部分的非托管資源會(huì)給系統(tǒng)帶來(lái)很多負(fù)面影響,例如數(shù)據(jù)庫(kù)連接不被釋放就可能導(dǎo)致連接池中的可用數(shù)據(jù)庫(kù)連接用盡。文件不關(guān)閉會(huì)導(dǎo)致其它進(jìn)程無(wú)法讀寫這個(gè)文件等等。?
實(shí)現(xiàn)模型:?
1、由于大多數(shù)的非托管資源都要求可以手動(dòng)釋放,所以,我們應(yīng)該專門為釋放非托管資源公開一個(gè)方法。實(shí)現(xiàn)IDispose接口的Dispose方法是最好的模型,因?yàn)镃#支持using語(yǔ)句快,可以在離開語(yǔ)句塊時(shí)自動(dòng)調(diào)用Dispose方法。?
2、雖然可以手動(dòng)釋放非托管資源,我們?nèi)匀灰谖鰳?gòu)函數(shù)中釋放非托管資源,這樣才是安全的應(yīng)用程序。否則如果因?yàn)槌绦騿T的疏忽忘記了手動(dòng)釋放非托管資源, 那么就會(huì)帶來(lái)災(zāi)難性的后果。所以說(shuō)在析構(gòu)函數(shù)中釋放非托管資源,是一種補(bǔ)救的措施,至少對(duì)于大多數(shù)類來(lái)說(shuō)是如此。?
3、由于析構(gòu)函數(shù)的調(diào)用將導(dǎo)致GC對(duì)對(duì)象回收的效率降低,所以如果已經(jīng)完成了析構(gòu)函數(shù)該干的事情(例如釋放非托管資源),就應(yīng)當(dāng)使用SuppressFinalize方法告訴GC不需要再執(zhí)行某個(gè)對(duì)象的析構(gòu)函數(shù)。?
4、析構(gòu)函數(shù)中只能釋放非托管資源而不能對(duì)任何托管的對(duì)象/資源進(jìn)行操作。因?yàn)槟銦o(wú)法預(yù)測(cè)析構(gòu)函數(shù)的運(yùn)行時(shí)機(jī),所以,當(dāng)析構(gòu)函數(shù)被執(zhí)行的時(shí)候,也許你進(jìn)行操作的托管資源已經(jīng)被釋放了。這樣將導(dǎo)致嚴(yán)重的后果。?
5、(這是一個(gè)規(guī)則)如果一個(gè)類擁有一個(gè)實(shí)現(xiàn)了IDispose接口類型的成員,并創(chuàng)建(注意是創(chuàng)建,而不是接收,必須是由類自己創(chuàng)建)它的實(shí)例對(duì)象,則 這個(gè)類也應(yīng)該實(shí)現(xiàn)IDispose接口,并在Dispose方法中調(diào)用所有實(shí)現(xiàn)了IDispose接口的成員的Dispose方法。?
只有這樣的才能保證所有實(shí)現(xiàn)了IDispose接口的類的對(duì)象的Dispose方法能夠被調(diào)用到,確??梢允謩?dòng)釋放任何需要釋放的資源。

來(lái)源:https://www./content-1-397601.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多