对C#中的Close()和Dispose()的浅析
.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可。
有些类说Close比说Dispose更符合用户的理解(如关闭连接、关闭流),所以这让我觉得Close就是作为Dispose的另一种使用方式而存在,本来只需一个Dispose就够了,事实上呢我写的程序也没有因为随意使用它俩而造成过任何问题,所以一直以来没深究。
今天做了个测试:
1 SqlConnection conn = new SqlConnection("连接字符串");
2 conn.Open();
3
4 conn.Close();//先关闭
5 Console.WriteLine(conn.State);//连接状态:关闭
6
7 Console.WriteLine(conn.ConnectionString);//此时连接字符串还在
8 conn.Open();//再打开。正常
9
conn.Dispose();//先释放
Console.WriteLine(conn.State);//连接状态:关闭
Console.WriteLine(conn.ConnectionString);//连接字符串已经置为空:string.Empty
14 conn.Open();//再打开。抛异常
测试结果:
1、两者都关闭了数据库连接
2、Close后数据库连接可以再次打开;而Dispose后连接字符串被清空,连接不能再打开。
如此看来,Close和Dispose不完全是一回事。现在似乎可以理解为,Close不负责销毁对象,仅仅是根据类的功能,实现业务上的一个“关闭”,在本例,仅仅是改变了一下连接状态(从连接→关闭);而Dispose,则是销毁对象并释放资源。换言之,Close只与业务有关,Dispose只与对象有关。所以被Close的对象可以再次使用,而Dispose则彻底销毁。
注:原则上能 Dispose 的类就要 Dispose ,类似FileStream 的对象如果不在后面的代码中使用,不用 close 直接Dispose 即可,Dispose其实隐含了close 的。
数据连接对象推荐使用 using 代码块自动释放以防止中途出现异常,.net 不要把对象 = null; 在一般情况下.net的一个变量如 FileStream fs = new FileStream(@"C:\test.txt", FileMode.OpenOrCreate);这个只是一个地址而已,= null 是没啥用的。如果等于null 反倒影响GC回收了。
综上,得出浅显结论:
1、Close负责关闭业务,Dispose负责销毁对象。Dispose会负责Close的一切事务,额外还有销毁对象的工作,即Dispose包含Close
2、当有明确需求的时候,不要混用二者
3、两者连在一起用没什么意义。要么关闭以便再次使用,要么销毁不再使用。
如各位有更好见解,欢迎指正。
对C#中的Close()和Dispose()的浅析的更多相关文章
- C#中ref和out的区别浅析
这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通 ...
- MySQL中lock tables和unlock tables浅析
MySQL中lock tables和unlock tables浅析 在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Se ...
- C#中窗体的close,dispose,以及application.exit()的区别
close关闭窗体,对象仍然存在,调用Close函数释放资源后可能还需要再次使用. dispose,销毁对象,窗体对象被回收了,也就是不存在了,Dispose函数释放的资源不再使用. applicat ...
- EF Core中DbContext可以被Dispose多次
我们知道,在EF Core中DbContext用完后要记得调用Dispose方法释放资源.但是其实DbContext可以多次调用Dispose方法,虽然只有第一次Dispose会起作用,但是DbCon ...
- RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )
Github 相关代码: Github地址 一直感觉 RxJava2 的取消订阅有点混乱, 这样也能取消, 那样也能取消, 没能系统起来的感觉就像掉进了盘丝洞, 迷乱… 下面说说这几种情况 几种取消的 ...
- SQL中Round(),Floor(),Ceiling()函数的浅析
项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...
- javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方 ...
- Java中HashMap等的实现要点浅析
@南柯梦博客中的系列文章对Jdk中常用容器类ArrayList.LinkedList.HashMap.HashSet等的实现原理以代码注释的方式给予了说明(详见http://www.cnblogs.c ...
- [原创]Android系统中常用JAVA类源码浅析之HashMap
由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...
随机推荐
- 如何打包/运行jar包,及生成exe文件
关于如何打包/运行jar包,以及生成exe文件.之前各种查询.博客,终于搞明白究竟是咋回事.记得还做过笔记的.今天要打包生成exe用的时候,居然忘了咋怎来着.去查看之前的笔记,死活没找到(好像被删掉了 ...
- java Swing组件和事件处理(二)
1.BoxLayout类可以创建一个布局对象,成为盒式布局,BoxLayout在javax.Swing border 包中,java.swing 包提供一个Box类,该类也是一个类,创建的容器称作一 ...
- python修改hosts
#coding=utf-8 host = ['192.168.10.240 store.wondershare.com', '192.168.10.240 store.wondershare.jp', ...
- 俺也会刷机啦--windows7下刷android
刷机很多人都会,本文只为像我这种入门的朋友而写的. 风险提示: 1. SD卡数据极可能会丢失(我这次就全丢了). 2. 升级失败. (俺的)环境说明: windows7 专业版64位 cmd命令行工具 ...
- 20165206第4次实验《Android程序设计》实验报告
20165206第4次实验<Android程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教师:娄嘉鹏 实验日期:2 ...
- 连接Oracle时报错ORA-12541: TNS: 无监听程序
从开始菜单中打开“Oracle Net Configuration Assistance”,选择“监听程序配置”,如下图所示,点击下一步. 选择“重新配置”,如下图所示,点击下一步. 选择监听 ...
- 如何保证Redis的高可用
什么是高可用 全年时间里,99%的时间里都能对外提供服务,就是高可用 主备切换 在master故障时,自动检测,将某个slave切换为master的过程,叫做主备切换.这个过程,实现了Redis主从架 ...
- uva 1232
题意: 建筑物在多长的部分是最高的成为该建筑物的覆盖度.求所有建筑物的覆盖度之和. 链接: https://vjudge.net/contest/202699#problem/E 题解: 这道题还是挺 ...
- mysql-5.7.10-winx64 绿色版安装办法
mysql-5.7.10-winx64 绿色版安装办法 为了防止安装程序造成电脑系统冗余,经过测试,终于将绿色版的mysql for windows安装成功.当然很多是从事百度搜索到的,但作为一种积累 ...
- Python学习(十八)—— 数据库(三)
转载自http://www.cnblogs.com/linhaifeng/articles/7356064.html 一.数据操作 1.插入数据INSERT 1. 插入完整数据(顺序插入) 语法一: ...