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

詳解c# 接口IDisposable的用法

 更新時(shí)間:2020年10月28日 15:50:36   作者:一只獨(dú)行的猿  
這篇文章主要介紹了詳解c# 接口IDisposable的用法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下

  C#的每一個(gè)類型都代表一種資源,而資源又分為兩類:

  • 托管資源  由CLR管理分配和釋放的資源,即從CLR里new出來的對象。
  • 非托管資源  不受CLR管理的對象,如Windows內(nèi)核對象,或者文件、數(shù)據(jù)庫連接、套接字、COM對象等。

  如果類型用到了非托管資源,或者需要顯式釋放托管資源,那么需要讓類型繼承接口IDisposable。記住:如果類型需要顯式釋放資源,那么一定要繼承IDisposable接口。如:

class SampleClass:IDisposable
{
  private IntPtr nativeResource = Marshal.AllocHGlobal(100);//非托管資源
  private Bitmap bitmap = new Bitmap(100, 100);//托管資源
  private bool isDisposed = false;
  
  //實(shí)現(xiàn)IDisposable中的Dispose方法
  public void Dispose( )
  {
    Dispose(true);
    GC.SuppressFinalize(this);//通知垃圾回收器不用再調(diào)用終結(jié)器
  }
  //不必要的方法,只是為了符合其他語言的規(guī)范
  public void Close()
  {
    Dispose();
  }
  //必須的,防止程序員忘記顯示調(diào)用Dispose方法(隱式清理)
  ~SampleClass()
  {
    Dispose(false);
  }
  //非密封類修飾用protected virtual,提醒子類必須實(shí)現(xiàn)自己的清理方法時(shí)注意到父類的清理工作
  protected virtual void Dispose(bool isDisposing)
  {
    if(isDisposed)
    {
      return;
    }
    if(isDisposing)
    {
      //清理托管資源
      if(bitmap != null)
      {
        bitmap.Dispose();
        bitmap = null;
      }
    }
    //清理非托管資源
    if(nativeResource!=IntPtr.Zero)
    {
      Marshal.FreeHGlobal(nativeResource);
      nativeResource = IntPtr.Zero;
    }
    isDisposed = false;
  }
  
  public void SamplePublicMethod()
  {
    if(isDisposed)
    {
      throw new ObjectDisposedException("SampleClass", "SampleClass is disposed");
    }
    //代碼
  }
}

  繼承IDisposable接口,可以使用using語法糖。在using語句代碼塊內(nèi),可以使用聲明的對象,當(dāng)語句離開代碼塊后,系統(tǒng)自動(dòng)釋放資源:

//使用using方法,當(dāng)語句離開代碼塊后,using內(nèi)的對象自動(dòng)釋放
using (SampleClass sample = new SampleClass())
{
  //……
}
//以上代碼相當(dāng)于下面的代碼
SampleClass sample0 = new SampleClass();
try
{
  //……
}
finally
{
  sample0.Dispose();
}

  在SampleClass中,存在一個(gè)終結(jié)器(C++中叫析構(gòu)器)。其意義在于,調(diào)用者可能并不會(huì)主動(dòng)調(diào)用Dispose方法,而終結(jié)器會(huì)被垃圾回收器調(diào)用調(diào)用,所以它作為釋放資源的補(bǔ)救措施。

  在CLR中,每new一個(gè)對象時(shí),就會(huì)為該對象在堆上分配內(nèi)存,如果不再被引用,就會(huì)回收它們的內(nèi)存。如果沒有實(shí)現(xiàn)IDisposable接口的類型對象,垃圾回收器會(huì)直接釋放對象所占內(nèi)存;如果實(shí)現(xiàn)了,每次創(chuàng)建對象時(shí),CLR會(huì)將該對象的一個(gè)指針放到終結(jié)列表中,垃圾回收器在回收對象前會(huì)首先將終結(jié)列表中的指針放入一個(gè)freachable隊(duì)列。同時(shí),CLR會(huì)分配一個(gè)線程管理freachable隊(duì)列,調(diào)用對象終結(jié)器,只有此時(shí),對象才會(huì)被真正標(biāo)識(shí)為垃圾,并在下一次進(jìn)行垃圾回收時(shí)釋放對象所占內(nèi)存。即:實(shí)現(xiàn)IDisposable接口的類型,至少要經(jīng)過兩次垃圾回收才能真正釋放掉內(nèi)存。其中Dispose方法中的GC.SuppressFinalize()方法用于在顯示釋放資源后,通知垃圾回收器不用再調(diào)用終結(jié)器(隱式回收)釋放資源。

  在實(shí)現(xiàn)IDisposable接口時(shí),其Dispose()方法并沒有做實(shí)際的清理工作,但提供了帶bool參數(shù)的受保護(hù)的虛方法。因?yàn)樵擃愋涂赡鼙黄渌惱^承,如果子類實(shí)現(xiàn)自己的Dispose模式,受保護(hù)的虛方法可以提醒子類:在實(shí)現(xiàn)自己的清理方法時(shí),需要注意父類的清理工作(base.Dispose方法)。

  真正撰寫資源釋放代碼的虛方法有一個(gè)bool參數(shù),但是在顯示釋放資源(true)與隱式釋放資源(false)調(diào)用中傳入的參數(shù)不同。表明:隱式清理時(shí),只需要處理非托管資源就行。托管資源中的普通類型不需要手動(dòng)清理,而非普通類型需要手動(dòng)清理。

  Dispose模式設(shè)計(jì)思路:如果調(diào)用者顯示調(diào)用了Dispose方法,那么類型按部就班釋放自己的全部資源,然后通知垃圾回收器不需要再釋放(GC.SuppressFinalize()方法);而忘記調(diào)用Dispose方法,那么類型就假定自己的所有托管資源會(huì)全部交給垃圾回收器回收,不需要手動(dòng)清理。

以上就是詳解c# 接口IDisposable的用法的詳細(xì)內(nèi)容,更多關(guān)于c# 接口IDisposable的用法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#采用OpenXml實(shí)現(xiàn)給word文檔添加文字

    C#采用OpenXml實(shí)現(xiàn)給word文檔添加文字

    這篇文章主要介紹了C#采用OpenXml實(shí)現(xiàn)給word文檔添加文字的方法,包括了用法的實(shí)例分析,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • C#實(shí)現(xiàn)導(dǎo)出List數(shù)據(jù)到xml文件的方法【附demo源碼下載】

    C#實(shí)現(xiàn)導(dǎo)出List數(shù)據(jù)到xml文件的方法【附demo源碼下載】

    這篇文章主要介紹了C#實(shí)現(xiàn)導(dǎo)出List數(shù)據(jù)到xml文件的方法,涉及C#針對list類及xml文件的相關(guān)操作技巧,并附帶完整demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-08-08
  • 詳解C#中的字符串拼接@ $

    詳解C#中的字符串拼接@ $

    這篇文章主要介紹了C#中的字符串拼接@,$的相關(guān)知識(shí),代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • C#加解密之AES算法的實(shí)現(xiàn)

    C#加解密之AES算法的實(shí)現(xiàn)

    一般我們來說呢,對于加密,我們分為可逆和不可逆??赡婕用苡挚煞譃閷ΨQ加密(AES、DES等)和非對稱加密(RSA),還有就是一些編碼加密等(BASE64);不可逆的呢,大部分又都稱為摘要算法(MD5、SHA)。本文將用C#實(shí)現(xiàn)AES算法,需要的可以參考一下
    2022-08-08
  • C#編程中設(shè)置程序只可被運(yùn)行一次的方法

    C#編程中設(shè)置程序只可被運(yùn)行一次的方法

    這篇文章主要介紹了C#編程中設(shè)置程序只可被運(yùn)行一次的方法,包括一種讓程序自動(dòng)重啟以限制第二次被運(yùn)行的方法,需要的朋友可以參考下
    2015-11-11
  • C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式

    C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式

    目前為止許多編程語言和工具都包含對正則表達(dá)式的支持,C#也不例外,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 詳解如何通過wireshark實(shí)現(xiàn)捕獲C#上傳的圖片

    詳解如何通過wireshark實(shí)現(xiàn)捕獲C#上傳的圖片

    這篇文章主要為大家詳細(xì)介紹了如何通過wireshark實(shí)現(xiàn)捕獲C#上傳的圖片,文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11
  • C#中的多播委托和泛型委托

    C#中的多播委托和泛型委托

    這篇文章介紹了C#中的多播委托和泛型委托,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C# cmd中修改顯示(顯示進(jìn)度變化效果)的方法

    C# cmd中修改顯示(顯示進(jìn)度變化效果)的方法

    好多人想在運(yùn)行或者調(diào)試含有大量數(shù)據(jù)或者比較慢C#程序的時(shí)候能夠顯示自己的程序完成的程度,這里有一個(gè)方法能發(fā)不斷地修改cmd的同一行,以達(dá)到顯示完成百分比的目的
    2013-04-04
  • 利用C#實(shí)現(xiàn)將小數(shù)值四舍五入為整數(shù)

    利用C#實(shí)現(xiàn)將小數(shù)值四舍五入為整數(shù)

    在項(xiàng)目的開發(fā)中,遇到一些除法計(jì)算內(nèi)容會(huì)產(chǎn)生小數(shù)值,但是又需要根據(jù)項(xiàng)目的實(shí)際情況將這些小數(shù)內(nèi)容化為整數(shù),所以本文為大家整理了C#實(shí)現(xiàn)將小數(shù)值四舍五入為整數(shù)的方法,希望對大家有所幫助
    2023-07-07

最新評論