IDisposeable,Close

时间:2021-04-14 18:28:23

一.资源分类

资源分为托管资源和非托管资源。

非托管资源:所有的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