一.资源分类
资源分为托管资源和非托管资源。
非托管资源:所有的windows内核对象(句柄)都是非托管资源,如stream,数据库连接,GDI+和COM对象等,这些资源不受CLR管理。
托管资源:由CLR管理的资源。
释放
非托管资源:需要显式释放。
托管资源:系统释放。
二.释放方式
1.实现IDisposeable接口的Dispose()方法
2.采用析构函数
3.Close(),其实跟第一种一样
三.Dispose(),Close()区别
资源释放的一个正确的措施是实现IDisposeable接口Dispose()方法。需要释放资源时,显式调用Dispose()方法即可。
C#还有一个语法糖,使用Using块,在离开using块的时候,CLR会自动调用所创建对象的Dispose()方法。
Close():
public void Cloase() { //..... ((IDisposeable)this).Dispose(); }
Dispose():
void IDisposeable.Dispose() { this.Dispose(true);
GC.SuppressFinalize(this); }
从上面代码来看,Close()方法最终还是使用的Dispose()方法,
之所以这么做,是因为这些类型出于显式实现IDisposable的因素,在调用这些Dispose方法的时候,必须完成一次转型,如:
((IDisposable)new A()).Dispose();
为了避免转型,同时也为了避免不熟悉C#语法的开发人员更直观的释放资源,提供了Close方法。
GC.SuppressFinalize(this);
这是告诉CLR,在进行垃圾回收的时候,不用再继续调用析构函数了。也验证了析构函数只是作为资源释放的一种补救措施,真正有效的还是Dispose()。
下面是合理的释放模式函数:
class ShouldDispose:IDisposeable { public void Dispose() { this.Dispose(true); DC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(disposing) {...} } ~ShouldDispose(){...} //没有返回类型,没有参数,没有修饰符 } class test:ShouldDispose { protected virtual void Dispose(bool disposing) { if(disposing) { //执行子类清理代码 } else { //如果有必要,执行base.Dispose(disposing) } } public void Close() { //调用本类或基类的Dispose方法 } }
本文章内容来自CSDN:http://blog.csdn.net/luminji/article/details/16984497