当你用Dispose方法释放未托管对象的时候,应该调用GC.SuppressFinalize。如果对象正在终结队列(finalization queue),GC.SuppressFinalize会阻止GC调用Finalize方法。因为Finalize方法的调用会牺牲部分性能。如果你的Dispose方法已经对委托管资源作了清理,就没必要让GC再调用对象的Finalize方法(MSDN)。附上MSDN的代码,大家可以参考.
- public class BaseResource : IDisposable {
- // 指向外部非托管资源 private IntPtr handle;
- // 此类使用的其它托管资源. private Component Components;
- // 跟踪是否调用.Dispose方法,标识位,控制垃圾收集器的行为 private bool disposed = false;
- // 构造函数 public BaseResource()
- { // Insert appropriate constructor code here.
- } // 实现接口IDisposable.
- // 不能声明为虚方法virtual. // 子类不能重写这个方法.
- public void Dispose() {
- Dispose(true); // 离开终结队列Finalization queue
- // 设置对象的阻止终结器代码 //
- GC.SuppressFinalize(this); }
- // Dispose(bool disposing) 执行分两种不同的情况. // 如果disposing 等于 true, 方法已经被调用
- // 或者间接被用户代码调用. 托管和非托管的代码都能被释放 // 如果disposing 等于false, 方法已经被终结器 finalizer 从内部调用过,










