对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) ...
随机推荐
- django模板导入外部js和css等文件
1.新建文件夹templates(存放模板文件),新建文件夹media(存放js.css.images文件夹),并把两个文件夹放到了项目的根目录下 2.设定模板路径 设置模板路径比较简单,只要在set ...
- VMware安装windows10系统
- poj3662 二分+最短路
/* 给定一张无向图,要求找到1-n的路径,该路径上第k+1大的边是所有路径上最小的 如果没有1-n的路,那么输出-1 二分答案mid,遍历一次所有边,如果边权小于mid,则设为0,大于mid,则设为 ...
- Java 获取图片的大小、宽、高
参考:https://www.cnblogs.com/hongten/archive/2012/11/26/hongten_java_ImageReader_BufferedImage.html im ...
- 使用7zip批量压缩文件夹到不同压缩包
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" ...
- WEB测试总结
WEB测试总结:1.js文件session是否有缓存,如果没有缓存对服务器压力会很大:2.更改页面大小后,图表是否会再次向服务器请求数据:3.表单填写是否对html标识,script脚本做处理:(&l ...
- 一张图看懂JVM之垃圾回收算法详解
导读 ...
- last与lastb命令 读取的日志文件
在linux系统中,last与lastb命令用来列出目前与过去登录系统的用户相关信息.指令英文原义: last, lastb - show listing of last logged in user ...
- 页面注册系统--使用forms表单结合ajax
页面注册系统--使用forms表单结合ajax 在Django中通过forms构建一个表单 1.urls.py 配置路由 from django.conf.urls import url from d ...
- XShell发送命令到全部会话