对IDisposable接口的理解

本人最近接触一个项目,在这个项目里面看到很多类实现了IDisposable接口.在我以前的项目中都很少用过这个接口,只知道它是用来手动释放资源的.这么多地方用应该有它的好处,为此自己想对它有进一步的了解,但这个过程远没有我想象中的简单.

IDisposable接口定义:定义一种释放分配的资源的方法。

.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象 最简单的办法可以通过实现Finalize()来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法。 有一种更好的,那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法,而不是傻傻的等着GC来释放我们的对象.这种实现并不一定要使用了非托管资源后才用,如果你设计的类会在运行时有非常大的实例(象 GIS 中的Geometry),为了优化程序性能,你也可以通过实现该接口让客户调用端在确认不需要这些对象时手工释放它们 .

在定义一个类时,可以使用两种机制来自动释放未托管的资源.这些机制通常放在一起实现.因为每个机制都为问题提供了略为不同的解决方法.这两种机制是:

第一:声明一个析构函数,作为类的一个成员.在GC回收资源时会调用.

第二:在类中实现IDisposable接口

析构函数的问题:

执行的不确定性:析构函数是由GC调用的,而GC的调用是不确定的.如果对象占用了比较重要的资源,应尽可以早的释放资源.

IDisposable接口定义了一个模式,为释未托管资源提供了确定的机制,并避免产生析构函数固有的与GC相关的问题.

在实际应用了,常常是结合两种方法来取长补短.之所以要加上析构函数,是防止客户端没有调用Dispose方法.  

本人对IDisposable接口的理解是这样的:

这种手动释放资源的方式肯定要比等待GC来回收要效率高啊,于是出现了下面的示例类代码:

这个Foo类实现了IDisposable接口,里面有一个简单的方法:增加一个用户.

时间: 2024-10-31 20:55:03

对IDisposable接口的理解的相关文章

.NET中IDisposable接口的基本使用

首先来看MSDN中关于这个接口的说明: [ComVisible(true)] public interface IDisposable { // Methods void Dispose(); } 1.[ComVisible(true)]:指示该托管类型对 COM 是可见的. 2.此接口的主要用途是释放非托管资源.当不再使用托管对象时,垃圾回收器会自动释放分配给该对 象的内存.但无法预测进行垃圾回收的时间.另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资 源一无所知.将此接口的Dispose

IDisposable接口

正确实现 IDisposable .NET中用于释放对象资源的接口是IDisposable,但是这个接口的实现还是比较有讲究的,此外还有Finalize和Close两个函数. MSDN建议按照下面的模式实现IDisposable接口: 1 public class Fo IDisposable 2 { 3 public void Dispose() 4 { 5 Dispose(true); 6 GC.SuppressFinalize(this); 7 } 8 9 protected virtua

new-关于接口的理解,还有哪些不足的地方。。

问题描述 关于接口的理解,还有哪些不足的地方.. 是这样,楼主本人刚学Java的时候,看到抽象类与接口,感觉很不理解,时常为两者的业务场景纠缠不清. 后来在网上百度,七嘴八舌,要么只是说一些语法上的不同,要么就是提一些不痛不痒的例子,比如什么学生类,老师类实现人的某项功能balabala... 其实我个人觉得刚开始还是从代码层面上说话更能让人理解. 关于抽象类,在实际应用中我更喜欢把它当做"模板"来使用,抽象类的好处就是,一半事情,父类替你做了,OK,子类直接调取:另一半事情留给子类自

对C++和Go语言中接口的理解

一直对接口没有什么概念,感觉接口就是C++中的多态.个人理解,接口的作用就是让外部调用者不用关心这个类的类型,让公用的逻辑可以重用. 一个例子: 我们说燕子会飞,会喝水.按照一般的写法,我们需要定义一个燕子的类,然后写了会飞的函数.假设有这么个流程,燕子飞到河边,喝水.这个过程中要用燕子类的指针调用.这个过程没问题,能很快搞定. 没过多久,PM需要加功能(你懂的),我们要写个鸽子飞到河边,喝水.鸽子的飞法和喝水方法与燕子自然不同.鸽子类必然要重写.但是飞到河边,喝水.这个流程能不能复用呢.因为如

深入理解Java的接口与抽象类_java

对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为:    abstract void

对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会

编程 Finalize 和Dispose(bool disposing)和 Dispose() 的相同点: 这三者都是为了释放非托管资源服务的. Finalize 和 Dispose() 和Dispose(bool disposing)的不同点: Finalize是CRL提供的一个机制, 它保证如果一个类实现了Finalize方法,那么当该类对象被垃圾回收时,垃圾回收器会调用Finalize方法.而该类的开发者就必须在Finalize方法中处理 非托管资源的释放. 但是什么时候会调用Finali

伯伯菜园系列 之 “接口”白菜

前言 相信大家对接口是不陌生的,但是你真的理解什么是接口吗?真的能用好吗?我们口口声声说按接口 编程,到底如何接口编程呢?接口编程的意义在哪呢?...对于接口的迷茫,经常在三层结构里面看到的 ,千篇一律的把每一个Dao都写一个接口,每个Service再写一个接口,因为他们看的例子就是这样的,网 上很多例子都是这样的,这就叫按接口编程了?!心里没底,到下次自己写项目自己设计的时候再加上赶 进度怕是没这么勤奋的复制粘贴了,原因还是没有明白接口到底有什么用!甚着感觉接口这玩意就像脱裤 子放屁--多此一

农民伯伯 谈 接口 [interface]

前言      相信大家对接口是不陌生的,但是你真的理解什么是接口吗?真的能用好吗?我们口口声声说按接口编程,到底如何接口编程呢?接口编程的意义在哪呢?...对于接口的迷茫,经常在三层结构里面看到的,千篇一律的把每一个Dao都写一个接口,每个Service再写一个接口,因为他们看的例子就是这样的,网上很多例子都是这样的,这就叫按接口编程了?!心里没底,到下次自己写项目自己设计的时候再加上赶进度怕是没这么勤奋的复制粘贴了,原因还是没有明白接口到底有什么用!甚着感觉接口这玩意就像脱裤子放屁--多此一

java接口的应用举例

/* 接口的理解: 接口就是前期定义一个规则!某一个类A,为了扩展自身的功能,对外提供这个接口,后期只要是符合这个接口(规则) 的类(这个类是接口的子类),将子类对象的引用传递给类A中方法(方法中的参数就是该子类所实现的接口), 就可以和类A建立功能联系!降低了类与类之间的耦合性! */ //定义规则 interface USB{     public abstract void open();     public abstract void close(); }   //实现规则 //通过接