IDisposable接口详解

来源:互联网 发布:软件验收大纲 编辑:程序博客网 时间:2024/04/30 04:57
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();   }}

原创粉丝点击