IDisposable接口详解


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("析构函数执行...");

}

当我们编译这段代码的时候,我们发现编译器会报如下的错误:
这是因为编译器彻底屏蔽了父类的Finalize方法,编译器提示我们如果要重写Finalize方法我们要提供一个析构函数来代替,下面我们就提供一个析构函数:
~CaryClass()
{
    Console.WriteLine("析构函数执行...");
}
实际上这个析构函数编译器会将其转变为如下代码:
protected override void Finalize()
{
   try
   {
     Console.WritleLine("析构函数执行...");
   }
   finally
   {
     base.Finalize();
   }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值