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

2019-12-30 10:57:44于海丽
  •  {     connection.Close();   
  •  throw e;     }   
  • finally   {   
  •  cmd.Dispose();     connection.Close();   
  •  }     }   
  •  }    } 


    当你用Dispose方法释放未托管对象的时候,应该调用GC.SuppressFinalize。如果对象正在终结队列(finalization queue),GC.SuppressFinalize会阻止GC调用Finalize方法。因为Finalize方法的调用会牺牲部分性能。如果你的Dispose方法已经对委托管资源作了清理,就没必要让GC再调用对象的Finalize方法(MSDN)。附上MSDN的代码,大家可以参考.
     

    1. public class BaseResource : IDisposable     {   
    2. // 指向外部非托管资源     private IntPtr handle;   
    3. // 此类使用的其它托管资源.     private Component Components;   
    4. // 跟踪是否调用.Dispose方法,标识位,控制垃圾收集器的行为     private bool disposed = false;   
    5.  // 构造函数    public BaseResource()   
    6. {    // Insert appropriate constructor code here.   
    7. }    // 实现接口IDisposable.   
    8. // 不能声明为虚方法virtual.    // 子类不能重写这个方法.   
    9.  public void Dispose()     {   
    10.  Dispose(true);     // 离开终结队列Finalization queue   
    11.  // 设置对象的阻止终结器代码     //   
    12. GC.SuppressFinalize(this);    }   
    13.  // Dispose(bool disposing) 执行分两种不同的情况.     // 如果disposing 等于 true, 方法已经被调用   
    14.  // 或者间接被用户代码调用. 托管和非托管的代码都能被释放     // 如果disposing 等于false, 方法已经被终结器 finalizer 从内部调用过,