亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中標準的IDispose模式代碼詳解

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

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

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

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

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

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

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

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

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

Using(MyClass myObj = new MyClass())

{ ... }

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

Using(MyClass myObj = new MyClass())

{ ... }

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

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

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

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

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

    private bool _isDisposed;

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

通過上面的代碼,我們知道了,對于托管系統(tǒng)(C#的CLR為我們管理的),直接通過~IDisplosePattern()方法進行釋放,而~IDisplosePattern()這個方法何時被調用,我們是不知道的,因為它是由CLR幫助我們調用的,而我們手動進行dispose方法時,它會調用dispose(true)這個重載方法,它會幫助我們清理托管和非托管資源,如圖:

以上就是本次介紹的全部知識點內容,感謝大家的學習和對腳本之家的支持。

您可能感興趣的文章:

相關文章

  • 淺析C#中不同格式請求的區(qū)別

    淺析C#中不同格式請求的區(qū)別

    form-data?請求和?x-www-form-urlencoded?請求是兩種常見的?HTTP?請求體格式,這篇文章主要為大家詳細介紹了二者的區(qū)別與應用,希望對大家有所幫助
    2023-08-08
  • OpenXml讀寫Excel實例代碼

    OpenXml讀寫Excel實例代碼

    這篇文章主要介紹了OpenXml讀寫Excel代碼分享,大家參考使用
    2013-12-12
  • C# 動態(tài)輸出Dos命令執(zhí)行結果的實例(附源碼)

    C# 動態(tài)輸出Dos命令執(zhí)行結果的實例(附源碼)

    這篇文章主要介紹了C# 動態(tài)輸出Dos命令執(zhí)行結果的實例,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 利用C#9.0新語法如何提升if語句美感

    利用C#9.0新語法如何提升if語句美感

    這篇文章主要給大家介紹了關于利用C# 9.0新語法如何提升if語句美感的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 關于C#操作文件路徑(Directory)的常用靜態(tài)方法詳解

    關于C#操作文件路徑(Directory)的常用靜態(tài)方法詳解

    這篇文章主要給大家介紹了關于C#操作文件路徑(Directory)的常用靜態(tài)方法,Directory類位于System.IO 命名空間,Directory類提供了在目錄和子目錄中進行創(chuàng)建移動和列舉操作的靜態(tài)方法,需要的朋友可以參考下
    2021-08-08
  • 關于C#基礎知識回顧--反射(三)

    關于C#基礎知識回顧--反射(三)

    在前面例子中,由于MyClass類型的對象是顯示創(chuàng)建的,因此使用反射技術來調用MyClass上的方法沒有任何優(yōu)勢--以普通的方式調用對象上的方法會簡單的多
    2013-07-07
  • C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能

    C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能

    這篇文章介紹了C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C#常用GDI+文字操作匯總

    C#常用GDI+文字操作匯總

    這篇文章主要介紹了C#常用GDI+文字操作,包括文字投影、倒影、旋轉等特效,對于提升程序界面的視覺效果有很大的用處,需要的朋友可以參考下
    2014-08-08
  • C#利用RabbitMQ實現(xiàn)點對點消息傳輸

    C#利用RabbitMQ實現(xiàn)點對點消息傳輸

    RabbitMQ做為消息代理,負責接收和轉發(fā)消息,可以將RabbitMQ比喻為一個郵筒、一個郵局和一個郵遞員。本文主要以一個簡單的小例子,簡述RabbitMQ實現(xiàn)消息傳輸?shù)南嚓P內容,僅供學習分享使用,如有不足之處,還請指正。
    2021-05-05
  • C# 設置防火墻的創(chuàng)建規(guī)則

    C# 設置防火墻的創(chuàng)建規(guī)則

    這篇文章主要介紹了C# 設置防火墻的創(chuàng)建規(guī)則,幫助大家更好的利用c#操作防火墻,感興趣的朋友可以了解下
    2020-11-11

最新評論