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对象。 } }