对C#中的Close()和Dispose()的浅析

 

.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可。

有些类说Close比说Dispose更符合用户的理解(如关闭连接、关闭流),所以这让我觉得Close就是作为Dispose的另一种使用方式而存在,本来只需一个Dispose就够了,事实上呢我写的程序也没有因为随意使用它俩而造成过任何问题,所以一直以来没深究。

今天做了个测试:

对C#中的Close()和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   
10 conn.Dispose();//先释放
11 Console.WriteLine(conn.State);//连接状态:关闭
12  
13 Console.WriteLine(conn.ConnectionString);//连接字符串已经置为空:string.Empty  
对C#中的Close()和Dispose()的浅析

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()的浅析

上一篇:Zookeeper权限acl,acl的构成 scheme与id


下一篇:[转]Centos 7搭建Gitlab服务器超详细