对C#中的Close()和Dispose()的浅析
2018-06-17 20:15:31来源:未知 阅读 ()
.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可。
有些类说Close比说Dispose更符合用户的理解(如关闭连接、关闭流),所以这让我觉得Close就是作为Dispose的另一种使用方式而存在,本来只需一个Dispose就够了,事实上呢我写的程序也没有因为随意使用它俩而造成过任何问题,所以一直以来没深究。
今天做了个测试:
2 conn.Open();
3
4 conn.Close();//先关闭
5 Console.WriteLine(conn.State);//连接状态:关闭
6
7 Console.WriteLine(conn.ConnectionString);//此时连接字符串还在
8 conn.Open();//再打开。正常
9
10 conn.Dispose();//先释放
11 Console.WriteLine(conn.State);//连接状态:关闭
12
13 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、两者连在一起用没什么意义。要么关闭以便再次使用,要么销毁不再使用。
如各位有更好见解,欢迎指正。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 进程相关 2019-08-13
- 解决python中的Non-UTF-8 code starting with ‘\xbs4’ in 2019-07-24
- python输出九九乘法表 2019-07-24
- Django模板语言中的Filters的使用方法 2019-07-24
- Python中的int函数 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash