博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对C#中的Close()和Dispose()的浅显理解
阅读量:4618 次
发布时间:2019-06-09

本文共 1193 字,大约阅读时间需要 3 分钟。

.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.Emptyconn.Open();//再打开。抛异常

试验结果:

1、两者都关闭了连接

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

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

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

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

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

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

posted on
2013-06-11 15:49 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/ahdung/archive/2013/06/11/3131833.html

你可能感兴趣的文章
JS生成二维码
查看>>
Android 中的一些Manager
查看>>
halcon读取一张照片,并转化为灰度图像
查看>>
35岁前成功的12条黄金法则 三0七法则
查看>>
手机常用屏幕分辨率及材质名词解释
查看>>
Java 处理 XML 的三种主流技术及介绍
查看>>
nodejs框架express4.2 简单入门
查看>>
java exec python program
查看>>
windows防火墙命令详解
查看>>
【分治】简单说说快排
查看>>
A1117.Eddington Number
查看>>
如何预览将要上传的图片-使用H5的FileAPI
查看>>
ubuntu安装wine+plsql
查看>>
某谷 P5153 简单的函数
查看>>
sizzle源码分析 (4)sizzle 技术总结及值得我们学习的地方
查看>>
ECMAScript6词法
查看>>
ASP.NET Core 中文文档 第四章 MVC(3.1)视图概述
查看>>
软件工程项目之摄影App(第二次冲刺)
查看>>
Struts常见默认值重写
查看>>
iOS9的一些问题
查看>>