乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       印度阿三17 2019-08-19

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

      MSDN建議按照下面的模式實現(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的對象中實際上有兩個用于釋放資源的函數(shù):Dispose和Finalize。Finalize的目的是用于釋放非托管的資源,而Dispose是用于釋放所有資源,包括托管的和非托管的。

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

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

      然而,即使重復(fù)調(diào)用Finalize和Dispose也是不存在問題的,因為有變量m_disposed的存在,資源只會被釋放一次,多余的調(diào)用會被忽略過去。

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

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

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

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

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

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

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

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

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

      ?

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

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

      來源:https://www./content-1-397601.html

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多