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(); }}
- IDisposable接口详解
- IDisposable接口详解
- IDisposable 接口
- IDisposable 接口
- IDisposable 接口
- IDisposable接口
- IDisposable 接口
- IDisposable详解
- IDisposable接口的使用
- 正确实现 IDisposable 接口
- IDisposable 接口介绍
- 正确实现 IDisposable 接口
- 正确实现 IDisposable 接口
- 正确实现 IDisposable 接口
- 正确实现 IDisposable 接口
- IDisposable接口的理解
- C# IDisposable 接口
- 正确实现 IDisposable 接口
- 20.Java XML解析技术
- Error: could not open 'C:/Program Files/Java/jre6/lib/i386/jvm.cfg' 的处理方法
- java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils
- Qt的核心剖析:信息隐藏
- Nginx支持虚拟目录的配置
- IDisposable接口详解
- Silverlight动态添加数据模板(以RadGridView为例子)
- 旋转卡壳
- 网络管理
- Sencha Touch 2中如何弹出一个网页并关掉此网页
- boost asio async_write : how to not interleaving async_write calls?
- linux安装小记
- 《爱来不来》观后感
- 常用db2命令