分享

NET 清理非托管资源

 昵称10504424 2013-06-28
     类型的 Dispose 方法应释放它拥有的所有资源。它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源。该父类型的 Dispose 方法应该释放它拥有的所有资源并同样也调用其父类型的 Dispose 方法,从而在整个基类型层次结构中传播此模式。若要确保始终正确地清理资源,Dispose 方法应该可以被多次调用而不引发任何异常。Dispose 方法应该为它处置的对象调用 GC.SuppressFinalize 方法。如果对象当前在终止队列中,GC.SuppressFinalize 防止其 Finalize 方法被调用。请记住,执行 Finalize 方法会大大减损性能。如果您的 Dispose 方法已经完成了清理对象的工作,那么垃圾回收器就不必再调用对象的 Finalize 方法。
public class BaseResource: IDisposable
{
   private IntPtr handle;
   private Component Components;
   // 对象是否已被释放的标志
   private bool disposed = false;

   public BaseResource()   {   }

   // 释放资源,对外开放的可调用的方法
   public void Dispose()
   {
      Dispose(true);
      GC.SuppressFinalize(this);
   }

   // 释放资源,如果disposing为true,释放所有的托管资源和非托管资源,如果为false,则仅仅释放非托管资源,这主要是为了避免在析构函数中重复2次进行垃圾回收
   protected virtual void Dispose(bool disposing)
   {
      // 检查该对象是否已经被释放了
      if(!this.disposed)
      {
         if(disposing)
         {
            Components.Dispose();
         }
         CloseHandle(handle);
         handle = IntPtr.Zero;
      }
      disposed = true;         
   }

   // 析构函数,又名终结器
   ~BaseResource()      
   {
      // 释放非托管资源,在调用终结器方法时系统自动会对托管的资源进行垃圾回收
      Dispose(false);
   }

   // 允许多次调用Dispose,但会抛出异常publicvoid DoSomething()
   {
      if(this.disposed)
      {
         thrownew ObjectDisposedException();
      }
   }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多