分类: C/C++
2009-03-18 14:14:11
如果您在搜索引擎中搜索类似于“Finalize Dispose Close 区别”的短语,将会得到一大堆搜索结果,然而很多文章讲得都比较迷糊,甚至其中包含有错误,这里对这几个方法作一个介绍。
两个概念
为了便于理解,提出两个概念。
Finalize 和 Dispose
Finalize 和 Dispose 都是释放资源,Finalize 隐式释放资源,Dispose 显式释放资源,怎么理解呢?Finalize 是对象不可访问后自动被调用的,Dispose 是类使用者调用的。
对于类设计者:
对于类使用者:
也就是说,对于类使用者,我们只需要调用 Dispose 就可以了,不需要关注 Finalize,因为 Finalize 通常不是 public 的。如果类使用者没有调用 Dispose 方法,Finalize 是释放资源的最后防线。当然这些都是建立在类设计者遵照上述规则设计的前提下。
顺便说一下,有文提到 Dispose(bool disposing),这个带参数的 Dispose 通常是类设计者的事情,类使用者通常不会遇到。
那么 Close 是什么呢?
Close 这个方法在不同的类中有不同的含义,并没有任何规定要求 Close 具有特殊的含义,也就是说 Close 并不一定要释放资源,您也可以让 Close 方法表示“关门”。
不过,由于 Close 有“关”的意思,通常也把 Close 拿来释放资源,这也是允许的。比如文件操作中,用 Close 释放对象似乎比 Dispose 含义更准确,于是在设计类时,可以将 Close 设为 public,将 Dispose 设为 protected,然后由 Close 调用 Dispose。
根据经验,Close 和 Dispose 同时存在的情况下(均为 public),Close 并不表示释放资源,因为通常情况下,类设计者不应该使用两个 public 方法来释放相同的资源。