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

C#中標(biāo)準(zhǔn)的IDispose模式代碼詳解

 更新時(shí)間:2019年09月12日 15:44:33   作者:Leo_wlCnBlogs  
在本篇文章中小編給大家分享的是關(guān)于C#中標(biāo)準(zhǔn)的IDispose模式的實(shí)例用法相關(guān)內(nèi)容,有需要的朋友們測(cè)試下。

C#實(shí)現(xiàn)IDispose接口

.net的GC機(jī)制有兩個(gè)問題:首先GC并不能釋放所有資源,它更不能釋放非托管資源。其次,GC也不是實(shí)時(shí)的,所有GC存在不確定性。

為了解決這個(gè)問題donet提供了析構(gòu)函數(shù)

public class TestClass : System.IDisposable
{
  //供程序員顯式調(diào)用的Dispose方法
  public void Dispose()
  {
    //調(diào)用帶參數(shù)的Dispose方法,釋放托管和非托管資源
    Dispose(true);
    //手動(dòng)調(diào)用了Dispose釋放資源,那么析構(gòu)函數(shù)就是不必要的了,這里阻止GC調(diào)用析構(gòu)函數(shù)
    System.GC.SuppressFinalize(this);
  }

  //protected的Dispose方法,保證不會(huì)被外部調(diào)用。
  //傳入bool值disposing以確定是否釋放托管資源
  protected void Dispose(bool disposing)
  {
    if (disposing)
    {
      ///TODO:在這里加入清理"托管資源"的代碼,應(yīng)該是xxx.Dispose();
    }
    ///TODO:在這里加入清理"非托管資源"的代碼
  }

  //供GC調(diào)用的析構(gòu)函數(shù)
  ~TestClass()
  {
    Dispose(false);//釋放非托管資源
  }
}

而即使我們忘記了在合適的時(shí)候調(diào)用Dispose,GC也會(huì)在釋放對(duì)象的時(shí)候幫我們清理非托管資源的。GC所充當(dāng)?shù)慕巧皇且环N保障手段,它應(yīng)該充當(dāng)這種角色,我們不能過分依賴它。實(shí)際上,在較大的模塊退出時(shí)我們還應(yīng)該及時(shí)地手動(dòng)調(diào)用GC.Collect進(jìn)行垃圾回收。

為什么實(shí)現(xiàn)IDisposable接口的類的對(duì)象,因?yàn)?net CLR是采用GC(垃圾回收器)機(jī)制管理內(nèi)存,不想C++語言那樣,能保證對(duì)象的析構(gòu)函數(shù)在作用域結(jié)束時(shí)被總是被自動(dòng)調(diào)用,有時(shí)如果程序運(yùn)行的過程中一直沒有滿足啟動(dòng)GC的條件,則可能GC一次也沒啟動(dòng)。 這樣,如果一個(gè)類需要占用重要資源,就應(yīng)該實(shí)現(xiàn)IDisposable接口,或者使用另一種簡(jiǎn)捷的方式:使用Using,如:

Using(MyClass myObj = new MyClass())

{ ... }

對(duì)于沒有實(shí)現(xiàn)IDisposable接口的,也就沒什么Dispose方法,但他們的Finalize同樣不能保證被調(diào)用。

Using(MyClass myObj = new MyClass())

{ ... }

是一種好方法,但是只有MyClass實(shí)現(xiàn)了IDisposable接口才能這樣寫.

IDispose模式在C++中用的很多,用來清理資源,而在C#里,資源分為托管和非托管兩種,托管資源是由C#的CLR幫助我們清理的,它是通過調(diào)用對(duì)象的析構(gòu)函數(shù)完成的對(duì)象釋放工作,而對(duì)于非托管系統(tǒng)來說,則需要我們自己來釋放,例如數(shù)據(jù)庫連接對(duì)象,這就需要我們手動(dòng)去調(diào)用它的Dispose()方法來實(shí)現(xiàn)對(duì)象它的釋放,事實(shí)上,Dispose()內(nèi)容到底做了什么事,我們并不清楚,當(dāng)然這就是面向?qū)ο?,它不希望你關(guān)系實(shí)現(xiàn)的細(xì)節(jié),呵!

對(duì)于我們開發(fā)人員來說,在了解它怎么用之后,總會(huì)對(duì)它如何實(shí)現(xiàn)的產(chǎn)生興趣,下面,我將把C#里實(shí)現(xiàn)IDispose模式的代碼展現(xiàn)出來,大家一起來學(xué)習(xí)一下,事實(shí)上,它的使用場(chǎng)合也很多的,當(dāng)我們手動(dòng)對(duì)網(wǎng)站,數(shù)據(jù)庫作封裝時(shí),都會(huì)用的到,下面看一下代碼:

 /// <summary>
  /// 實(shí)現(xiàn)IDisposable,對(duì)非托管系統(tǒng)進(jìn)行資源回收
  /// </summary>
  public class IDisplosePattern : IDisposable
  {
    public void Dispose()
    {
      this.Dispose(true);////釋放托管資源
      GC.SuppressFinalize(this);//請(qǐng)求系統(tǒng)不要調(diào)用指定對(duì)象的終結(jié)器. //該方法在對(duì)象頭中設(shè)置一個(gè)位,系統(tǒng)在調(diào)用終結(jié)器時(shí)將檢查這個(gè)位
    }

    protected virtual void Dispose(bool disposing)
    {
      if (!_isDisposed)//_isDisposed為false表示沒有進(jìn)行手動(dòng)dispose
      {
        if (disposing)
        {
          //清理托管資源
        }
        //清理非托管資源
      }
      _isDisposed = true;
    }

    private bool _isDisposed;

    ~IDisplosePattern()
    {
      this.Dispose(false);//釋放非托管資源,托管資源由終極器自己完成了
    }
  }

通過上面的代碼,我們知道了,對(duì)于托管系統(tǒng)(C#的CLR為我們管理的),直接通過~IDisplosePattern()方法進(jìn)行釋放,而~IDisplosePattern()這個(gè)方法何時(shí)被調(diào)用,我們是不知道的,因?yàn)樗怯蒀LR幫助我們調(diào)用的,而我們手動(dòng)進(jìn)行dispose方法時(shí),它會(huì)調(diào)用dispose(true)這個(gè)重載方法,它會(huì)幫助我們清理托管和非托管資源,如圖:

以上就是本次介紹的全部知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。

相關(guān)文章

  • Unity編輯器預(yù)制體工具類PrefabUtility常用函數(shù)和用法

    Unity編輯器預(yù)制體工具類PrefabUtility常用函數(shù)和用法

    這篇文章主要為大家介紹了Unity編輯器預(yù)制體工具類PrefabUtility常用函數(shù)及用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C#/VB.NET實(shí)現(xiàn)將Html轉(zhuǎn)為Word的示例詳解

    C#/VB.NET實(shí)現(xiàn)將Html轉(zhuǎn)為Word的示例詳解

    本文分享以C#程序代碼為例,實(shí)現(xiàn)將Html文件轉(zhuǎn)換Word文檔的方法(附VB.NET代碼)。在實(shí)際轉(zhuǎn)換場(chǎng)景中可參考本文的方法,感興趣的可以了解一下
    2022-07-07
  • C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    TFTP不僅有斷點(diǎn)續(xù)傳,多用戶級(jí)別限制等功能,本文主要介紹了C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • C#實(shí)現(xiàn)23種常見的設(shè)計(jì)模式的示例詳解

    C#實(shí)現(xiàn)23種常見的設(shè)計(jì)模式的示例詳解

    設(shè)計(jì)模式通常分為三個(gè)主要類別:創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式,這些模式是用于解決常見的對(duì)象導(dǎo)向設(shè)計(jì)問題的最佳實(shí)踐,本文為大家整理了23種常見的設(shè)計(jì)模式的實(shí)現(xiàn)代碼,需要的可以參考一下
    2023-06-06
  • C#中將DataTable轉(zhuǎn)化成List<T>的方法解析

    C#中將DataTable轉(zhuǎn)化成List<T>的方法解析

    大家應(yīng)該都知道在.net項(xiàng)目中使用到DataTable和List<T>集合的地方較多,有的時(shí)候需要將DataTable轉(zhuǎn)化成List<T>,那么改如何轉(zhuǎn)化呢?下面通過這篇文章來一起學(xué)習(xí)下吧,本文中給出了詳細(xì)的示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值。
    2016-12-12
  • C# List中FindAll用法的一些簡(jiǎn)單示例

    C# List中FindAll用法的一些簡(jiǎn)單示例

    本篇文章只要是對(duì)C# List中FindAll用法的一些簡(jiǎn)單示例進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#使用文件流讀取文件的方法

    C#使用文件流讀取文件的方法

    這篇文章主要介紹了C#使用文件流讀取文件的方法,涉及C#中FileInfo類操作文件的技巧,需要的朋友可以參考下
    2015-04-04
  • C#文件操作類分享

    C#文件操作類分享

    這篇文章主要為大家分享了C#文件操作類的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法

    C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法,涉及C#遠(yuǎn)程連接及系統(tǒng)命令的調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • Unity3D實(shí)現(xiàn)批量下載圖片功能

    Unity3D實(shí)現(xiàn)批量下載圖片功能

    這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)批量下載圖片功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論

璧山县| 盐源县| 临澧县| 宜兰县| 齐河县| 濉溪县| 天峨县| 南城县| 来安县| 集贤县| 衡水市| 永胜县| 临桂县| 沈阳市| 化隆| 甘谷县| 仪陇县| 宿州市| 湾仔区| 通山县| 金湖县| 香格里拉县| 蒙城县| 甘肃省| 项城市| 乳源| 峡江县| 镇沅| 甘泉县| 荣成市| 扎兰屯市| 汉源县| 上高县| 乐至县| 恭城| 甘泉县| 蒲城县| 象州县| 莎车县| 长沙市| 阿拉善右旗|