GC-Finalize(析构函数)、Dispose、Close 的区别与使用

作者:vkvi 来源:ITPOW(原创) 日期:2007-8-15

如果您在搜索引擎中搜索类似于“Finalize Dispose Close 区别”的短语,将会得到一大堆搜索结果,然而很多文章讲得都比较迷糊,甚至其中包含有错误,这里对这几个方法作一个介绍。

Finalize 是 Visual Basic 中的方法,在 C# 中没有这个关键词,而是使用析构函数,为了和网上的介绍一致,本文也使用 Finalize 进行介绍,C# 用户可以直接把“Finalize”换成“析构函数”进行理解。

两个概念

为了便于理解,提出两个概念。

  • 类设计者:编写类的人。
  • 类使用者:应用类实例的人。

Finalize 和 Dispose

Finalize 和 Dispose 都是释放资源,Finalize 隐式释放资源,Dispose 显式释放资源,怎么理解呢?Finalize 是对象不可访问后自动被调用的,Dispose 是类使用者调用的。

对于类设计者:

  • Finalize 和 Dispose 释放的资源应该相同(除托管资源外,原因见本连载。),这样即使类使用者在没有调用 Dispose 的情况下,资源也会在 Finalize 中得到释放。
  • Dispose 中应该调用 GC.SuppressFinalize 方法,这样类使用者调用了 Dispose 后,就不会自动调用 Finalize 了,因为调用 Dispose 后没有必要再执行 Finalize。
  • Finalize 不应为 public。

对于类使用者:

  • 有 Dispose 方法存在时,应该调用它,因为 Finalize 释放资源通常是很慢的。

也就是说,对于类使用者,我们只需要调用 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 表示什么意思,它会不会释放资源,完全由类设计者决定。网上说“Close 调用 Dispose”这种方法是很片面的。在 SqlConnection 中 Close 只是表示关闭数据库连接,并没有释放 SqlConnection 这个对象资源。

根据经验,Close 和 Dispose 同时存在的情况下(均为 public),Close 并不表示释放资源,因为通常情况下,类设计者不应该使用两个 public 方法来释放相同的资源。

相关阅读

网友评论

  • 建议看看这篇文章对你会有帮助的  C#中Dispose和Close的区别和各自的用法   http://www.150it.cn/bianchengwendang/Csap/96192.html(125.211.*.* 2008-01-16 09:25:48)

相关文章