C#开发中的垃圾回收机制简析

2019-12-30 10:57:44于海丽
  •  //你就不能在引用其他对象,只有非托管资源可以被释放。    protected virtual void Dispose(bool disposing)   
  •  {     // 检查Dispose 是否被调用过.   
  •  if (!this.disposed)     {   
  •  // 如果等于true, 释放所有托管和非托管资源     if (disposing)   
  •  {     // 释放托管资源.   
  • Components.Dispose();     }   
  • // 释放非托管资源,如果disposing为 false,     // 只会执行下面的代码.   
  • CloseHandle(handle);    handle = IntPtr.Zero;   
  •  // 注意这里是非线程安全的.    // 在托管资源释放以后可以启动其它线程销毁对象,   
  •  // 但是在disposed标记设置为true前    // 如果线程安全是必须的,客户端必须实现。   
  •  }    disposed = true;   
  • }     // 使用interop 调用方法   
  • // 清除非托管资源.     [System.Runtime.InteropServices.DllImport("Kernel32")]   
  • private extern static Boolean CloseHandle(IntPtr handle);    // 使用C# 析构函数来实现终结器代码   
  • // 这个只在Dispose方法没被调用的前提下,才能调用执行。     // 如果你给基类终结的机会.   
  •  // 不要给子类提供析构函数.     ~BaseResource()   
  •  {     // 不要重复创建清理的代码.   
  • // 基于可靠性和可维护性考虑,调用Dispose(false) 是最佳的方式     Dispose(false);   
  •  }     // 允许你多次调用Dispose方法,   
  •  // 但是会抛出异常如果对象已经释放。     // 不论你什么时间处理对象都会核查对象的是否释放,