1. MSDN中关于这个接口的说明[ComVisible(true)]
public interface IDisposable
{
// Methods
void Dispose();
}
[ComVisible(true)]:指示该托管类型对 COM 是可见的。此接口的主要用途是释放非托管资源。当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。但无法预测进行垃圾回收的时间。另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。将此接口的Dispose方法与垃圾回收器一起使用来显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。
2. 基本应用
定义一个实现了IDisposable接口的类,代码如下:
public class CaryClass :IDisposable
{
public void DoSomething()
{
Console.WriteLine("Do some thing....");
}
public void Dispose()
{
Console.WriteLine("及时释放资源");
}
}
有两种方式来调用:
第一种方式,使用Using语句会自动调用Dispose方法,代码如下:
using (CaryClass caryClass = new CaryClass())
{
caryClass.DoSomething();
}
第二种方式,现实调用该接口的Dispose方法,代码如下:
CaryClass caryClass = new CaryClass();
try
{
caryClass.DoSomething();
}
finally
{
IDisposable disposable = caryClass as IDisposable;
if (disposable != null) disposable.Dispose();
}
3. Disposable 模式
在.NET种由于当对象变为不可访问后将自动调用Finalize方法,所以我们手动调用IDisposable接口的Dispose方法和对象终结器调用的方法极其类似,我们最好将他们放到一起来处理。我们首先想到的是重写Finalize方法,如下:
protected override void Finalize()
{
Console.WritleLine("析构函数执行...");
}当我们编译这段代码的时候,我们发现编译器会报如下的错误:
~CaryClass()
{
Console.WriteLine("析构函数执行...");
}实际上这个析构函数编译器会将其转变为如下代码:protected override void Finalize()
{
try
{
Console.WritleLine("析构函数执行...");
}
finally
{
base.Finalize();
}
}
830

被折叠的 条评论
为什么被折叠?



