知识大全 C#清理非托管对象[2]
Posted 资源
篇首语:一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#清理非托管对象[2]相关的知识,希望对你有一定的参考价值。
C#清理非托管对象[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
public class MyDerivedResource: MyResourceRelease private bool _disposed = false; protected override void Dispose(bool isDisposing) if(_disposed) return; try if(isDisposing) //释放托管资源 //释放非托管资源 _disposed = true; finally base Dispose(isDisposing);这样可以确保释放继承链上所有对象的引用资源 在整个继承层次中传播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);
cha138/Article/program/net/201311/15536相关参考