c#中IDisposable接口的使用方法

  介绍

本篇文章给大家分享的是有关c#中IDisposable接口的使用方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

c#的每一个类型都代表一种资源,而资源又分为两类:

    <李>托管资源,由CLR管理分配和释放的资源,即从CLR里新出来的对象。 <李>非托管资源,不受CLR管理的对象,如Windows内核对象,或者文件,数据库连接,套接字,COM对象等。

如果类型用到了非托管资源,或者需要显式释放托管资源,那么需要让类型继承接口IDisposable。记住:如果类型需要显式释放资源,那么一定要继承IDisposable接口。如:

类SampleClass: IDisposable
  {
  私人IntPtr nativeResource=Marshal.AllocHGlobal(100);//非托管资源
  私人位图的位图=new位图(100、100);//托管资源
  私人bool isDisposed=false;//实现IDisposable中的处理方法
  公共空间处理()
  {
  处理(真正的);
  GC.SuppressFinalize(这);//通知垃圾回收器不用再调用终结器
  }//不必要的方法,只是为了符合其他语言的规范
  公共空间Close ()
  {
  处理();
  }//必须的,防止程序员忘记显示调用处理方法(隐式清理)
  ~ SampleClass ()
  {
  处理(假);
  }//非密封类修饰用保护虚拟,提醒子类必须实现自己的清理方法时注意到父类的清理工作
  保护虚拟空间处理(bool isDisposing)
  {
  如果(isDisposed)
  {
  返回;
  }
  如果(isDisposing)
  {//清理托管资源
  如果(位图!=null)
  {
  bitmap.Dispose ();
  位图=零;
  }
  }//清理非托管资源
  如果(nativeResource !=IntPtr.Zero)
  {
  Marshal.FreeHGlobal (nativeResource);
  nativeResource=IntPtr.Zero;
  }
  isDisposed=false;
  }
  
  公共空间SamplePublicMethod ()
  {
  如果(isDisposed)
  {
  把新的ObjectDisposedException (“SampleClass",“SampleClass disposed");
  }//代码
  }
  }

继承IDisposable接口,可以使用使用语法糖。在使用语句代码块内,可以使用声明的对象,当语句离开代码块后,系统自动释放资源:

//使用使用方法,当语句离开代码块后,使用内的对象自动释放   使用(SampleClass示例=new SampleClass ())   {//?   }//以上代码相当于下面的代码   SampleClass sample0=new SampleClass ();   试一试   {//?   }   最后   {   sample0.Dispose ();   }

在SampleClass中,存在一个终结器(C + +中叫析构器)。其意义在于,调用者可能并不会主动调用处理方法,而终结器会被垃圾回收器调用调用,所以它作为释放资源的补救措施。

在CLR中,每新的一个对象时,就会为该对象在堆上分配内存,如果不再被引用,就会回收它们的内存。如果没有实现IDisposable接口的类型对象,垃圾回收器会直接释放对象所占内存,如果实现了,每次创建对象时,CLR会将该对象的一个指针放到终结列表中,垃圾回收器在回收对象前会首先将终结列表中的指针放入一个freachable队列。同时,CLR会分配一个线程管理freachable队列,调用对象终结器,只有此时,对象才会被真正标识为垃圾,并在下一次进行垃圾回收时释放对象所占内存。即:实现IDisposable接口的类型,至少要经过两次垃圾回收才能真正释放掉内存。其中处理方法中的GC.SuppressFinalize()方法用于在显示释放资源后,通知垃圾回收器不用再调用终结器(隐式回收)释放资源。

在实现IDisposable接口时,其处理()方法并没有做实际的清理工作,但提供了带bool参数的受保护的虚方法。因为该类型可能被其他类继承,如果子类实现自己的处理模式,受保护的虚方法可以提醒子类:在实现自己的清理方法时,需要注意父类的清理工作(基地。处理方法)。

真正撰写资源释放代码的虚方法有一个bool参数,但是在显示释放资源(真正的)与隐式释放资源(false)调用中传入的参数不同。表明:隐式清理时,只需要处理非托管资源就行。托管资源中的普通类型不需要手动清理,而非普通类型需要手动清理。

处理模式设计思路:如果调用者显示调用了处理方法,那么类型按部就班释放自己的全部资源,然后通知垃圾回收器不需要再释放(GC.SuppressFinalize()方法);而忘记调用处理方法,那么类型就假定自己的所有托管资源会全部交给垃圾回收器回收,不需要手动清理。

以上就是c#中IDisposable接口的使用方法,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

c#中IDisposable接口的使用方法