我以前写的一个参考一下
实现一个boolean参数的受保护的Dispose方法。该方法释放类封装的所有非托管资源(如文件句柄)如果传递给受保护的dispose的参数是true,那么也对所有包装非托管资源的类成员)调用close或dispose(从IDisposable中继承的公共dispose
实现.net框架的IDisposable接口,它包含一个不带参数的Dispose方法,通过调用GC.SuppressFinalize实现公共的Dispose,可以防止垃圾回收器调用Finalize,然后调用受保护的Dispose并向它传递true;
重写Finalize.对象被销坏时,垃圾回收器调用Finalize.在Finalize中,调用受保护的Dispose并传递false,这个false参数很重要,因为它可以防止受保护的Dispose对任何封装的Dispose对任何封装类成员(如果垃圾回收器已经运行,那么其中许多成员已经被销毁)调用Close或公共的Dispose,
如果语法上是合理的(如类封装的资源可以以句柄的形式关闭),那么可以实现调用公共Dispose的Close方法:
基于以上的原则,实现一个File类的正确方法如下:
Class file:IDisposable
{
  protected Intptr Handle = IntPtr.Zero;
  public File(string name)
  {
   //todo:打开文件并将句柄复制到Handel
  } 
 ~file()
  {
   Dispose(false)
   }
   public void Dispose()
   {
    GC.SuppressFinalize(this);
    Dispose(true);
    }
   protected virtual void Dispose(bool disposing)
  {
   //todo:关闭文件句柄
   if(disposeing)
   //todo 如果类中有包装非托管资源的成员
   //在这里对它们调用Close或Dispose
}
}
public void close()
{
Dispose();
}
}关于更详细的说明可以参见NDD(非确定性销毁)