当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别?

首先,Dispose和Close基本上应该是一样的。Close是为了那些不熟悉Dispose的开发者设计的。因为基本上所有的developer都知道Close是干吗的(特别是对于那些有C++背景的developer)。

但是当我们写code时候,如果要实现Close和Dispose的时候,要注意Close和Dispose的设计模式。.net的一些class只提供Close,而且派生自IDisposable,并且隐藏了Dispose方法。是不是觉得很不明白了?

对这些class来说,关键在于它们显式的(explicitly)实现了IDisposable。对于隐式实现来说,你只需要调用"new A().Dispose()",但是对于显式实现来说,Dispose不会是这个class的成员函数。唯一的调用方式是你先要cast到 IDisposable才行。(“new A().Dispose()”编译不过,但是“((IDisposable)new A()).Dispose()”可以编译过)。所以这样就符合了设计的要求:提供Close(),隐藏Dispose(),并且实现了 IDisposable接口。

在.net的framework里,Close()被设计成public的,并且在Close()里面call被隐藏的Dispose(); Dispose()去call另一个virtual的Dispose(bool)函数。所以如果你从这个class继承,你就必须实现Dispose (bool)方法。

调用者call Close()的时候就会call到你重载的那个Dispose(bool)方法去释放资源。

最新文章

  1. ASP.NET MVC5----基本用法
  2. Linux学习笔记(二)
  3. Elasticsearch入门必备——ES中的字段类型以及常用属性
  4. pku 1703(种类并查集)
  5. STL中vector容器实现反转(reverse)
  6. 258. Add Digits
  7. 电商安全无小事,如何有效地抵御 CSRF 攻击?
  8. 【HBase学习】Apache HBase 参考手册 中文版
  9. innodb_support_xa
  10. NHibernate 帮助类(单例实际运用)
  11. Android 打造自己的个性化应用(四):仿墨迹天气实现-->自定义扩展名的zip格式的皮肤
  12. Selenium来抓取动态加载的页面
  13. 用于主题检测的临时日志(18506589-369d-4505-a204-3678db17eae5 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
  14. linux基础命令大全
  15. 【JAVAWEB学习笔记】22_ajax
  16. 大数据技术生态圈形象比喻(Hadoop、Hive、Spark 关系)
  17. Docker 案例: 在容器中部署静态网站
  18. 如何在vue单页应用中使用百度地图
  19. Hibernate的注解和检索
  20. JQuery限制文本框只能输入数字和小数点的方法

热门文章

  1. SQL server 安装教程
  2. java实验报告&第三周学习总结
  3. RAC_单实例_DG 关于两端创建表空间数据文件路径不一致的问题注意点
  4. leetcode206 反转链表 两种做法(循环,递归)
  5. NIO组件之channel
  6. 使用事件CreateEvent注意事项 多进程同步的方法
  7. 【SpringMVC】---RequestMapping、Ant 路径、PathVariable 注解、HiddenHttpMethodFilter 过滤器、用 POJO 作为参数
  8. Java多线程学习——例子:模拟电影院抢座位
  9. ssh远程连接linux服务器并执行命令
  10. python每日一练:0005题