C# IDispose使用实例

一给  金牌会员 | 2024-11-30 21:06:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 794|帖子 794|积分 2382

  1. using System;
  2. using System.ComponentModel;
  3. //下面的例子演示了如何创建
  4. //实现IDisposable接口的资源类
  5. //和IDisposable。处理方法。
  6. public class DisposeExample
  7. {
  8. //实现IDisposable的基类。
  9. //通过实现IDisposable,你宣布
  10. //这种类型的实例分配稀缺资源。
  11.     public class MyResource: IDisposable
  12.     {
  13.         // 指向外部非托管资源的指针。
  14.         private IntPtr handle;
  15.         // 该类使用的其他托管资源。
  16.         private Component component = new Component();
  17.         // 跟踪是否调用了Dispose。
  18.         private bool disposed = false;
  19.        //类的构造函数。
  20.         public MyResource(IntPtr handle)
  21.         {
  22.             this.handle = handle;
  23.         }
  24.        //实现IDisposable。
  25.        //不要将此方法设为虚方法。
  26.         //派生类不能重写此方法。
  27.         public void Dispose()
  28.         {
  29.             Dispose(disposing: true);
  30.            //该对象将被Dispose方法清除。
  31.           //因此,应该调用GC。SuppressFinalize来将此对象从终结队列中移除
  32.           //并阻止此对象的终结代码从执行第二次。
  33.             GC.SuppressFinalize(this);
  34.         }
  35.       //在两个不同的场景中执行Dispose(bool Dispose)。
  36.      //如果dispose = true,则直接调用了该方法
  37.      //或间接地由用户的代码。受管资源和非受管资源
  38.     //可以处理。
  39.     //如果dispose = false,则该方法已被
  40.     //终止器内部的运行时,你不应该引用
  41.     //其他对象。只能处置非托管资源。
  42.         protected virtual void Dispose(bool disposing)
  43.         {
  44.             //检查是否已经调用了Dispose。
  45.             if(!this.disposed)
  46.             {
  47.                 //如果处置等于true,处置所有已管理的非托管资源。
  48.                 if(disposing)
  49.                 {
  50.                     // 处置托管资源。
  51.                     component.Dispose();
  52.                 }
  53.               //调用适当的方法进行清理
  54.               //这里的非托管资源。
  55.               //如果处置为false,
  56.               //只执行以下代码。
  57.                 CloseHandle(handle);
  58.                 handle = IntPtr.Zero;
  59.               //处理完成。
  60.                 disposed = true;
  61.             }
  62.         }
  63.         //使用interop调用必要的方法清理非托管资源。
  64.         [System.Runtime.InteropServices.DllImport("Kernel32")]
  65.         private extern static Boolean CloseHandle(IntPtr handle);
  66.         //使用c#终结器语法来终结代码。
  67.        //只有当Dispose方法被调用时,这个终结器才会运行
  68.        //不被调用。
  69.       //它给基类一个完成的机会。
  70.        //不要在该类派生的类型中提供终结器。
  71.         ~MyResource()
  72.         {
  73.            //不要在这里重新创建Dispose清理代码。
  74.            //调用Dispose(Dispose: false)是最优的
  75.           //可读性和可维护性。
  76.             Dispose(disposing: false);
  77.         }
  78.     }
  79.     public static void Main()
  80.     {
  81.        //在这里插入代码创建
  82.        //并使用MyResource对象。
  83.     }
  84. }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表