标签:
一、Close与Dispose这两种方法的区别
调用完了对象的Close方法后,此对象有可能被重新进行使用;而Dispose方法来说,此对象所占有的资源需要被标记为无用了,也就是此对象要被销毁,不能再被使用。例如常见.Net类库中的SqlConnection这个类,当调用完Close方法后,可以通过Open重新打开一个数据库连接,当彻底不用这个对象了就可以调用Dispose方法来标记此对象无用,等待GC回收。
二、三者的区别如图
析构函数 | Dispose方法 | Close方法 | |
意义 | 销毁对象 | 销毁对象 | 关闭对象资源 |
调用方式 | 不能被显示调用,在GC回收是被调用 | 需要显示调用或者通过using语句 | 需要显示调用 |
调用时机 | 不确定 | 确定,在显示调用或者离开using程序块 | 确定,在显示调用时 |
三、析构函数 和 Dispose 的说明
四、Close函数的说明
Close 这个方法在不同的类中有不同的含义,并没有任何规定要求 Close 具有特殊的含义,也就是说 Close 并不一定要释放资源,您也可以让 Close 方法表示“关门”。 不过,由于 Close 有“关”的意思,通常也把 Close 拿来释放资源,这也是允许的。比如文件操作中,用 Close 释放对象似乎比 Dispose 含义更准确,于是在设计类时,可以将 Close 设为 public,将 Dispose 设为 protected,然后由 Close 调用 Dispose。 也就是说 Close 表示什么意思,它会不会释放资源,完全由类设计者决定。网上说“Close 调用 Dispose”这种方法是很片面的。在 SqlConnection 中 Close 只是表示关闭数据库连接,并没有释放 SqlConnection 这个对象资源。 根据经验,Close 和 Dispose 同时存在的情况下(均为 public),Close 并不表示释放资源,因为通常情况下,类设计者不应该使用两个 public 方法来释放相同的资源。
五、析构函数和Dispose方法实例
1 public class BaseResource: IDisposable 2 ...{ 3 ~BaseResource() 4 ...{ 5 // 为了保持代码的可读性性和可维护性,千万不要在这里写释放非托管资源的代码 6 // 必须以Dispose(false)方式调用,以false告诉Dispose(bool disposing)函数是从垃圾回收器在调用 析构函数 时调用的 7 Dispose(false); 8 } 9 // 无法被客户直接调用 10 // 如果 disposing 是 true, 那么这个方法是被客户直接调用的,那么托管的,和非托管的资源都可以释放 11 // 如果 disposing 是 false, 那么函数是从垃圾回收器在调用Finalize时调用的,此时不应当引用其他托管对象所以,只能释放非托管资源 12 protected virtual void Dispose(bool disposing) 13 ...{ 14 // 那么这个方法是被客户直接调用的,那么托管的,和非托管的资源都可以释放 15 if(disposing) 16 ...{ 17 // 释放 托管资源 18 OtherManagedObject.Dispose(); 19 } 20 //释放非托管资源 21 DoUnManagedObjectDispose(); 22 // 那么这个方法是被客户直接调用的,告诉垃圾回收器从Finalization队列中清除自己,从而阻止垃圾回收器调用 析构函数 方法. 23 if(disposing) 24 GC.SuppressFinalize(this); 25 } 26 //可以被客户直接调用 27 public void Dispose() 28 ...{ 29 //必须以Dispose(true)方式调用,以true告诉Dispose(bool disposing)函数是被客户直接调用的 30 Dispose(true); 31 } 32 }
参考:
托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象;
非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、COM对象等;
标签:
原文地址:http://www.cnblogs.com/newlive/p/5393873.html