对C#中的Close()和Dispose()的浅析
.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、两者连在一起用没什么意义。要么关闭以便再次使用,要么销毁不再使用。
如各位有更好见解,欢迎指正。