WEB开发网
开发学院软件开发C语言 C#.Net中的非托管代码清理 阅读

C#.Net中的非托管代码清理

 2009-04-04 08:22:51 来源:WEB开发网   
核心提示: 这样可以确保释放继承链上所有对象的引用资源,在整个继承层次中传播Dispose模式.那用Dispose方式非托管资源就是最好的方法了吗?其实不然,C#.Net中的非托管代码清理(4),因为类型实现了IDispose接口,这个类的使用者必须显示调用Dispose方法,或者没有使用using关

这样可以确保释放继承链上所有对象的引用资源,在整个继承层次中传播Dispose模式.

那用Dispose方式非托管资源就是最好的方法了吗?

其实不然,因为类型实现了IDispose接口,这个类的使用者必须显示调用Dispose方法,或者在创建该类型对象的时候使用using关键 字,对于一些粗心的使用者可能会忘记调用Dispose方法,或者没有使用using关键字,这样就导致了非托管资源没有释放的后果.

最佳方案

同时实现终结器和Dispose方式.这样对于细心的使用者直接显示调用Dispose方法会提高垃圾回收的性能,对于粗心的使用者虽然忘记了调用Dispose方法,但也不至于使得非托管资源得不到释放.

注意这里用到了GC. SuppressFinalize(this)方法.

代码如下:

public class MyResourceRelease: IDisposable
{
~MyResourceRelease()
{
Dispose(false);
}
/// 保证资源只用释放一次
private bool _alreadyDisposed = false;
/// 用来判断释放资源的类别(托管和非托管)
protected virtual void Dispose(bool isDisposing)
{
if(_alreadyDisposed)
{
return;
}
if(isDisposing)
{
//释放托管资源
}
//释放非托管资源
_alreadyDisposed = true;
}
public void Dispose()
{
Dispose(true);
//阻止GC把该对象放入终结器队列
GC.SuppressFinalize(this);
}
}

上一页  1 2 3 4 

Tags:Net 托管 代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接