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