C# IDispose使用实例

  • C# IDispose使用实例已关闭评论
  • 12 次浏览
  • A+
所属分类:.NET技术
摘要

 

using System; using System.ComponentModel;  //下面的例子演示了如何创建 //实现IDisposable接口的资源类 //和IDisposable。处理方法。  public class DisposeExample { //实现IDisposable的基类。 //通过实现IDisposable,你宣布 //这种类型的实例分配稀缺资源。     public class MyResource: IDisposable     {         // 指向外部非托管资源的指针。         private IntPtr handle;         // 该类使用的其他托管资源。         private Component component = new Component();         // 跟踪是否调用了Dispose。         private bool disposed = false;         //类的构造函数。         public MyResource(IntPtr handle)         {             this.handle = handle;         }        //实现IDisposable。        //不要将此方法设为虚方法。         //派生类不能重写此方法。         public void Dispose()         {             Dispose(disposing: true);            //该对象将被Dispose方法清除。           //因此,应该调用GC。SuppressFinalize来将此对象从终结队列中移除           //并阻止此对象的终结代码从执行第二次。             GC.SuppressFinalize(this);         }       //在两个不同的场景中执行Dispose(bool Dispose)。      //如果dispose = true,则直接调用了该方法      //或间接地由用户的代码。受管资源和非受管资源     //可以处理。     //如果dispose = false,则该方法已被     //终止器内部的运行时,你不应该引用     //其他对象。只能处置非托管资源。         protected virtual void Dispose(bool disposing)         {             //检查是否已经调用了Dispose。             if(!this.disposed)             {                 //如果处置等于true,处置所有已管理的非托管资源。                 if(disposing)                 {                     // 处置托管资源。                     component.Dispose();                 }                //调用适当的方法进行清理               //这里的非托管资源。               //如果处置为false,               //只执行以下代码。                 CloseHandle(handle);                 handle = IntPtr.Zero;                //处理完成。                 disposed = true;             }         }          //使用interop调用必要的方法清理非托管资源。         [System.Runtime.InteropServices.DllImport("Kernel32")]         private extern static Boolean CloseHandle(IntPtr handle);          //使用c#终结器语法来终结代码。        //只有当Dispose方法被调用时,这个终结器才会运行        //不被调用。       //它给基类一个完成的机会。        //不要在该类派生的类型中提供终结器。         ~MyResource()         {            //不要在这里重新创建Dispose清理代码。            //调用Dispose(Dispose: false)是最优的           //可读性和可维护性。             Dispose(disposing: false);         }     }     public static void Main()     {        //在这里插入代码创建        //并使用MyResource对象。     } }