网站建设资讯

NEWS

网站建设资讯

c#中IDisposable接口的使用方法-创新互联

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

龙岩网站建设公司成都创新互联,龙岩网站设计制作,有大型网站制作公司丰富经验。已为龙岩近1000家提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的龙岩做网站的公司定做!

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

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

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

class SampleClass:IDisposable
{
  private IntPtr nativeResource = Marshal.AllocHGlobal(100);//非托管资源
  private Bitmap bitmap = new Bitmap(100, 100);//托管资源
  private bool isDisposed = false;
  
  //实现IDisposable中的Dispose方法
  public void Dispose( )
  {
    Dispose(true);
    GC.SuppressFinalize(this);//通知垃圾回收器不用再调用终结器
  }
  //不必要的方法,只是为了符合其他语言的规范
  public void Close()
  {
    Dispose();
  }
  //必须的,防止程序员忘记显示调用Dispose方法(隐式清理)
  ~SampleClass()
  {
    Dispose(false);
  }
  //非密封类修饰用protected virtual,提醒子类必须实现自己的清理方法时注意到父类的清理工作
  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");
    }
    //代码
  }
}

本文名称:c#中IDisposable接口的使用方法-创新互联
本文路径:http://njwzjz.com/article/dsisgh.html