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 方法来释放相同的资源。

转自: 郝文标的博客

Finalize、Dispose、Close 的区别与使用[C#基础]相关推荐

  1. final finally finalize三者有什么区别

    final   finally   finalize三者有什么区别 : (1)final: a) 一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为a ...

  2. Finalize,Dispose,SuppressFinalize

    MSDN建议按照下面的模式实现IDisposable接口: Code1 public class Foo: IDisposable2 {3 public void Dispose()4 {5 Disp ...

  3. Finalize/Dispose/Destructor

    我总是会搞混这些东西,还是写下来帮助记忆. Finalize 即Object.Finalize(),C#中不允许使用Finalize,析构器就等价于Finalize. Destructor 析构器(D ...

  4. 请简述final、finalize和finally的区别

    final是一个可以修饰变量.方法和类的修饰符.如果用来修饰变量,则该变量的值在初始化后不能被改变.方法不可覆盖,类不可继承. finalize是对象被回收之前调用的方法,给对象自己最后一个复活的机会 ...

  5. java类接口的区别_【Java基础】java接口和类的区别-瑶瑶吖的回答

    基本语法区别 Java中接口和抽象类的定义语法分别为interface与abstract关键字. 抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为 ...

  6. 字节字符区别Java_【JAVA基础】字符数组与字节数组的区别

    String.getBytes()和String.tocharArray(),字节数组和字符数组的区别 String.getBytes()是将字符串转化为一个字节数组.而String.toCharAr ...

  7. C语言 vprintf 函数和 printf 函数区别 - C语言零基础入门教程

    目录 一.vprintf 函数和 printf 函数声明简介 1.printf 函数声明 2.vprintf 函数声明 二.vprintf 函数和 printf 函数使用 三.猜你喜欢 零基础 C/C ...

  8. C语言 全局变量和局部变量区别 - C语言零基础入门教程

    目录 一.全局变量和局部变量简介 1.全局变量简介 2.局部变量简介 二.全局变量和局部变量注意事项 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语 ...

  9. C语言 NULL 和 0 区别 - C语言零基础入门教程

    目录 一.关于 NULL 定义 二.NULL 和 0 区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.关于 NULL 定义 NU ...

最新文章

  1. PMP-【第5章 项目范围管理】-2021-1-27(116页-135页)
  2. 基于android os 5.1,Android 5.1.1版氢OS快速体验
  3. python虚拟环境的使用
  4. HAProxy 的负载均衡服务器,Redis 的缓存服务器
  5. jedis使用_Mybatis的二级缓存、使用Redis做二级缓存
  6. java idea连数据库报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone'时区错误
  7. 设置主机名 centos redhad7
  8. 初识BGP外部网关协议(二)
  9. ubuntu 18.04 melodic roslaunch :七步使用roslaunch控制两个终端机器人
  10. C# 参考之方法参数关键字:params、ref及out (收集)
  11. 报错--Problem executing scripts APT::Update
  12. 10.TCP/IP 详解卷1 --- 动态选路协议
  13. Ajax 重新绑定 webgrid 数据,绑定WebGrid表单AJAX
  14. 手把手教你学DSP(TMS320X281X) 2020-11-30
  15. 中彩3d组合王 霏凡软件站
  16. 神通数据库最新安装教程(2021年底)
  17. win10修改计算机物理地址,Windows10系统修改物理地址的方法
  18. Jupyter Notebook 自动生成目录(超级实用)
  19. arduino 44键盘制作简易计算器
  20. 富士胶片展示透明投影膜、CMF表面装饰材料及HydroAg+抗菌技术

热门文章

  1. 中国软件面临生死劫恶性竞争似饮鸩止渴
  2. excel导出word批注_打印或导出目录列表到MS Word&Excel
  3. (Java面试基础)==和equals的区别
  4. mysql数据库sql优化看这里之索引优化
  5. 【问题篇】打包Vue-cli3创建的vue项目成App的apk文件
  6. ORA-00257归档日志清理脚本
  7. PMP 含金量大吗?
  8. cad的三维多段线怎么批量转成多段线
  9. 旷视落子天元:深度学习框架开源,是成为伟大AI企业的第一步
  10. 原型的作用、原理、用途