对C#中的Close()和Dispose()的浅显理解

.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可,这一意识源于《NET设计规范:约定、惯用法与模式》一书中,P239和P240关于这俩方法的设计建议。按书中的字面理解,Close就应该设计为与Dispose一样的功能,是为了照顾自然语言的一种考量,的确对于有些类,说Close比说Dispose更符合用户的理解(如关闭连接、关闭流),所以这让我觉得Close就是作为Dispose的另一种使用渠道而存在,本来只需一个Dispose就够了,事实上我也没有因为随意使用它俩而造成过任何问题,所以一直以来没深究。

可是今天在回答一个百度知道问题的时候,涉及到这俩方法的讨论,我有意识的做了个试验:

SqlConnection conn = new SqlConnection("连接字串");
conn.Open();

conn.Close();//先关闭
Console.WriteLine(conn.State);//连接状态:关闭

Console.WriteLine(conn.ConnectionString);//此时连接字串还在
conn.Open();//再打开。正常

conn.Dispose();//先释放
Console.WriteLine(conn.State);//连接状态:关闭

Console.WriteLine(conn.ConnectionString);//连接字串以置空,为string.Empty
conn.Open();//再打开。抛异常

试验结果:

1、两者都关闭了连接

2、Close后连接可以再次打开;而Dispose后连接字串被清空,连接不能再打开

如此看来,Close和Dispose不完全是一回事,有点毁三观。现在似乎可以理解为,Close不负责销毁对象,仅仅是根据类的功能,实现业务上的一个“关闭”,在本例,仅仅是改变了一下连接状态(从连接→关闭);而Dispose,则一如它的使命一样,销毁对象并释放资源。换言之,Close只与业务有关,Dispose只与对象有关。所以被Close的对象可以再次“打开”并使用,而Dispose则彻底歇菜。

综上,关于它俩,得出浅显结论:

1、Close负责关闭业务,Dispose负责销毁对象。Dispose会负责Close的一切事务,额外还有销毁对象的工作,即Dispose包含Close

2、当你有明确需求的时候,不要混用二者

3、两者连在一起用没什么意义。要么关闭~以便再次使用,要么销毁~不再使用

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

那些年我们踩过的坑

事件背景 有一天leader给程序员cover分配了一个需求,cover一看,需求很简单嘛,就是在页面异步拉取数据展示就OK了,于是就和cgi同事阿翔对接了一下...

24610
来自专栏王清培的专栏

.NET重构—单元测试的代码重构

阅读目录: 1.开篇介绍 2.单元测试、测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的...

2196
来自专栏海说

深入理解计算机系统(3.1)---走进汇编的世界

  本系列拖了蛮久了,主要是因为LZ写的时候其实刚看到第二章,因此这一段时间快速看了下第三章,并花了点时间沉淀了一下,这才耽误了下来。

973
来自专栏程序员与猫

async/await 的基本实现和 .NET Core 2.1 中相关性能提升

1062
来自专栏玩转全栈

flutter全局数据共享通知方案

让我们先抛开Flutter这个平台说话,如果让你实现数据共享,你能想到的基础方案有哪些。

2.9K18
来自专栏程序员与猫

async/await 的基本实现和 .NET Core 2.1 中相关性能提升

1534
来自专栏大数据挖掘DT机器学习

并行爬虫和数据清洗工具(开源)

etlpy是python编写的网页数据抓取和清洗工具,核心文件etl.py不超过500行,具备如下特点 爬虫和清洗逻辑基于xml定义,不需手工编写 基于pyth...

4734
来自专栏草根专栏

设计模式学习(一):多用组合少用继承(C#)

《深入浅出设计模式》学习笔记第一章 原始需求和设计 事情是这样开始的,公司需要做一套程序,鸭子,设计如下: ? 一个鸭子父类,多个派生类,三个可override...

4554
来自专栏海说

深入理解计算机系统(3.1)---走进汇编的世界

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer13.html

1033
来自专栏海说

深入理解计算机系统(3.1)---走进汇编的世界

  本系列拖了蛮久了,主要是因为LZ写的时候其实刚看到第二章,因此这一段时间快速看了下第三章,并花了点时间沉淀了一下,这才耽误了下来。

1476

扫码关注云+社区

领取腾讯云代金券