亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#資源釋放方法實例分析

2020-01-24 01:15:57
字體:
來源:轉載
供稿:網友

本文實例講述了C#資源釋放方法。分享給大家供大家參考,具體如下:

1、try{}finally{}

2、using

只有類型實現了IDisposable接口并且重寫Dispose()方法可以使用using語句實現資源釋放.

首先來看MSDN中關于這個接口的說明:

[ComVisible(true)]public interface IDisposable{ // Methodsvoid Dispose();}

1.[ComVisible(true)]:

指示該托管類型對 COM 是可見的.

2.此接口的主要用途是釋放非托管資源。

當不再使用托管對象時,垃圾回收器會自動釋放分配給該對象的內存。但無法預測進行垃圾回收的時間。另外,垃圾回收器對窗口句柄或打開的文件和流等非托管資源一無所知。將此接口的Dispose方法與垃圾回收器一起使用來顯式釋放非托管資源。當不再需要對象時,對象的使用者可以調用此方法。

一、基本應用

1.我們來定義一個實現了IDisposable接口的類,代碼如下:

public class TestClass :IDisposable{  public void DoSomething()  {    Console.WriteLine("Do some thing....");  }  public void Dispose()  {    Console.WriteLine("及時釋放資源");  }}

2.我們有兩種方式來調用:

2.1.第一種方式,使用Using語句會自動調用Dispose方法,代碼如下:

using (TestClass testClass = new TestClass()){  testClass.DoSomething();}

2.2第二種方式,現實調用該接口的Dispose方法,代碼如下:

TestClass testClass = new TestClass();try {  testClass.DoSomething();}finally{  IDisposable disposable = testClass as IDisposable;  if (disposable != null)  disposable.Dispose();}

兩種方式的執行結果是一樣的。

2.3.使用try/catch/finally的好處是,捕獲異常后可以進行處理與此同時也可以釋放資源;但是使用using,有異常也可以釋放資源,只是無法對異常進行處理,直接將異常放行,而已實際上這兩種方法對資源的釋放上是一樣的.

二、Disposable 模式

1.在.NET種由于當對象變為不可訪問后將自動調用Finalize方法,所以我們手動調用IDisposable接口的Dispose方法和對象終結器調用的方法極其類似,我們最好將他們放到一起來處理。

我們首先想到的是重寫Finalize方法,如下:

protected override void Finalize(){  Console.WritleLine("析構函數執行...");}

當我們編譯這段代碼的時候,我們發現編譯器會報如下的錯誤: 這是因為編譯器徹底屏蔽了父類的Finalize方法,編譯器提示我們如果要重寫Finalize方法我們要提供一個析構函數來代替,下面我們就提供一個析構函數:

~TestClass() { Console.WriteLine("析構函數執行..."); }

實際上這個析構函數編譯器會將其轉變為如下代碼:

protected override void Finalize(){  try {    Console.WritleLine("析構函數執行...");  }  finally {    base.Finalize();  }}

2.然后我們就可以將Dispose方法的調用和對象的終結器放在一起來處理,如下:

public class TestClass: IDisposable{  ~TestClass()  {    Dispose();  }  public void Dispose()  { // 清理資源  }}

3.上面實現方式實際上調用了Dispose方法和Finalize方法,這樣就有可能導致做重復的清理工作,所以就有了下面經典Disposable 模式:

private bool _isDisposed = false;public void Dispose(){  Dispose(true);  GC.SupressFinalize(this);}protected void Dispose(bool Diposing){  if(!_isDisposed)  {    if(Disposing)    {      //清理托管資源    }    //清理非托管資源  }  _isDisposed=true;}~TestClass(){  Dispose(false);}

3.1. SupressFinalize方法以防止垃圾回收器對不需要終止的對象調用 Object.Finalize()。

3.2. 使用IDisposable.Dispose 方法,用戶可以在可將對象作為垃圾回收之前隨時釋放資源。如果調用了 IDisposable.Dispose方法,此方法會釋放對象的資源。這樣,就沒有必要進行終止。IDisposable.Dispose 應調用 GC.SuppressFinalize 以使垃圾回收器不調用對象的終結器。

3.3.我們不希望Dispose(bool Diposing)方法被外部調用,所以他的訪問級別為protected 。如果Diposing為true則釋放托管資源和非托管資源,如果 Diposing等于false則該方法已由運行庫從終結器內部調用,并且只能釋放非托管資源。

3.4.如果在對象被釋放后調用其他方法,則可能會引發 ObjectDisposedException。

三、實例解析

1.下面代碼對Dispose方法做了封裝,說明如何在使用托管和本機資源的類中實現 Dispose(bool) 的常規示例:

public class BaseResource : IDisposable{  // 非托管資源  private IntPtr _handle;  //托管資源  private Component _components;  // Dispose是否被調用  private bool _disposed = false;  public BaseResource() { }  public void Dispose()  {    Dispose(true);    GC.SuppressFinalize(this);  }  protected virtual void Dispose(bool disposing)  {    if (!this._disposed)    {      if (disposing)      {        // 釋放托管資源        _components.Dispose();      }      // 釋放非托管資源,如果disposing為false, 只有非托管資源被釋放      CloseHandle(_handle);      _handle = IntPtr.Zero;      // 注意這里不是線程安全的    }    _disposed = true;  }  // 析構函數只會在我們沒有直接調用Dispose方法的時候調用  // 派生類中不用在次提供析構函數  ~BaseResource() { Dispose(false); }  // 如果你已經調用了Dispose方法后再調用其他方法會拋出ObjectDisposedException  public void DoSomething()  {    if (this._disposed)    {      throw new ObjectDisposedException();    }  }}public class MyResourceWrapper : BaseResource{  // 托管資源  private ManagedResource _addedManaged;  // 非托管資源  private NativeResource _addedNative;  private bool _disposed = false;  public MyResourceWrapper() { }  protected override void Dispose(bool disposing)  {    if (!this._disposed)    {      try      {        if (disposing)        {          _addedManaged.Dispose();        }        CloseHandle(_addedNative);        this._disposed = true;      }      finally      {        base.Dispose(disposing);      }    }  }}

2.使用CLR垃圾收集器,您不必再擔心如何管理對托管堆分配的內存,不過您仍需清理其他類型的資源。托管類通過IDisposable接口使其使用方可以在垃圾收集器終結對象前釋放可能很重要的資源。通過遵循disposable模式并且留意需注意的問題,類可以確保其所有資源得以正確清理,并且在直接通過Dispose調用或通過終結器線程運行清理代碼時不會發生任何問題。

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品福利视频| 亚洲最大av网| 亚洲石原莉奈一区二区在线观看| 亚洲国产欧美在线成人app| 黄色成人av网| 色系列之999| 亚洲高清一二三区| 亚洲成人黄色在线| 性色av一区二区三区| 国产精品中文字幕在线观看| 2021久久精品国产99国产精品| 久热精品视频在线观看一区| 91精品久久久久| 亚洲自拍欧美色图| 欧美精品久久久久久久久| 欧美成人午夜免费视在线看片| 福利精品视频在线| 欧美日韩国产黄| 亚洲xxxx做受欧美| 日产精品久久久一区二区福利| 91极品视频在线| 国产精品美女主播| 欧美精品电影在线| 国产成人亚洲综合青青| 国产日韩换脸av一区在线观看| 日韩成人性视频| 欧美剧在线观看| 欧美激情视频一区二区三区不卡| 欧美性猛交xxxx乱大交极品| 91国产视频在线播放| 亚洲free性xxxx护士hd| 欧美激情国产日韩精品一区18| 亚洲免费一在线| 国产午夜精品美女视频明星a级| 久久伊人精品一区二区三区| 欧美二区在线播放| 精品女厕一区二区三区| 成人福利在线视频| 精品在线观看国产| 91av在线影院| 91久久国产综合久久91精品网站| 国产亚洲欧洲高清| 日韩成人激情在线| 992tv成人免费影院| 高清一区二区三区日本久| 欧美一级淫片丝袜脚交| 欧美最猛黑人xxxx黑人猛叫黄| 日韩在线观看高清| 欧美激情一区二区三区在线视频观看| 成人免费看吃奶视频网站| 久久精品视频中文字幕| 日韩中文字幕精品视频| 欧美精品成人91久久久久久久| 亚洲国产精品中文| 国产婷婷色综合av蜜臀av| 亚洲欧美日韩在线一区| 国产丝袜一区二区| 456国产精品| 日韩中文字幕在线视频| 亚洲天堂久久av| 中文字幕一区电影| 欧美成人一区在线| 国产精品亚洲自拍| 精品成人国产在线观看男人呻吟| 超碰97人人做人人爱少妇| 国产91精品久久久久久| 日本精品视频在线观看| 久久99精品国产99久久6尤物| 92看片淫黄大片看国产片| 91社区国产高清| 2018国产精品视频| 中文字幕久热精品在线视频| 亚洲精品欧美日韩专区| 91超碰caoporn97人人| 国产精品视频网| 97超碰国产精品女人人人爽| 亚洲精品国产成人| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品视频在线观看| 在线视频中文亚洲| 国产激情久久久久| 九九热99久久久国产盗摄| 中文字幕亚洲无线码在线一区| 日韩中文字幕在线免费观看| 91影视免费在线观看| 亚洲欧美综合图区| 亚洲精品国产拍免费91在线| 九色91av视频| 日韩在线观看免费网站| 亚洲欧美日韩一区二区三区在线| 午夜精品久久久久久久男人的天堂| 岛国视频午夜一区免费在线观看| 九色精品免费永久在线| 91成人在线视频| 国内精品在线一区| 国产99视频在线观看| 日韩精品视频在线观看网址| 97免费视频在线播放| 亚洲激情视频在线| 国产精品成人一区二区| 欧美诱惑福利视频| 中文字幕亚洲综合| 久久精品视频在线观看| 精品久久久久久亚洲国产300| 成人性生交大片免费看小说| 亚洲女性裸体视频| 亚洲欧美另类中文字幕| 亚洲欧美国产高清va在线播| 国产成人精品视频在线观看| 亚洲女人被黑人巨大进入| 日韩一区视频在线| 亚洲成年网站在线观看| 亚洲一区中文字幕在线观看| 国产成人在线一区二区| 日韩国产高清视频在线| 久久久精品一区二区三区| 国产精品久久久久久久电影| 成人黄色av免费在线观看| 国产日韩在线免费| 久久精品中文字幕| 欧美丝袜美女中出在线| 日韩美女写真福利在线观看| 国产精品jvid在线观看蜜臀| 亚洲视频免费一区| 国产精品亚洲激情| 亚洲成人激情在线| 亚洲自拍偷拍视频| 欧美大片欧美激情性色a∨久久| 欧美性生交xxxxxdddd| 久热在线中文字幕色999舞| 88xx成人精品| 久久久久国产精品一区| 国产精品成人一区二区三区吃奶| 欧美做爰性生交视频| 亚洲精品99999| 久久久久久国产三级电影| 菠萝蜜影院一区二区免费| 成人网在线观看| 日韩一区二区久久久| 日韩电影免费观看在线观看| 亚洲精品一区二区三区婷婷月| 国产视频久久久| 中文字幕欧美在线| 亚洲r级在线观看| 国模精品视频一区二区三区| 欧美在线www| 成人国产在线视频| 日韩精品免费观看| 欧美另类99xxxxx| 国产欧美一区二区白浆黑人| 中文字幕精品www乱入免费视频| 久久精品成人欧美大片古装| 98精品国产高清在线xxxx天堂| 亚洲一区亚洲二区| 国产成人小视频在线观看| 91精品久久久久久久久久入口| 在线视频中文亚洲| 欧美激情在线观看| 国产日韩欧美91| 一区三区二区视频| 亚洲第一区中文99精品| 久操成人在线视频| 亚洲人成伊人成综合网久久久| 亚洲欧美另类自拍|