Rocho.J

人脑是不可靠的, 随时记录感悟并且经常重复!

 

[转] --- 如何真正的实现IDispos -- 转自 http://www.cnblogs.com/olartan/archive/2011/12/15/2288566.html

最近在项目开发的过程中, 我们的一个数据同步程序碰到了资源无法释放的问题。我使用的定位方法是性能计数器(Perfmon.msc), 显然这只是一个很粗矿的判断。后通过Code Review我们的代码中定义了一个同步的中间类, 该类中会缓存大量的中间数据集。而程序中么有及时的回收这些临时对象, 最终我建议该类实现一下IDispose接口。这里我结合网上的资料以及MSDN的建议实现了一个标准的IDispose接口, 代码如下:


复制代码
View Code
public class SampleClass : System.IDisposable
{
private bool alreadyDisposed=false;
//供程序员显式调用的Dispose方法
public void Dispose()
{
//调用带参数的Dispose方法, 释放托管和非托管资源
Dispose(true);
//手动调用了Dispose释放资源,那么析构函数就是不必要的了, 这里阻止GC调用析构函数
System.GC.SuppressFinalize(this);
}

//protected的Dispose方法, 保证不会被外部调用。
//传入bool值disposing以确定是否释放托管资源
protected void Dispose(bool disposing)
{
if (alreadyDisposed) return; //保证不重复释放

if (disposing)
{
///TODO:在这里加入清理"托管资源"的代码, 应该是xxx.Dispose();
}
///TODO:在这里加入清理"非托管资源"的代码

alreadyDisposed=true;
}

//供GC调用的析构函数
~SampleClass ()
{
Dispose(false);//释放非托管资源
}
}
复制代码

posted on 2012-06-22 18:07  RJ  阅读(314)  评论(0)    收藏  举报

导航