• 对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   
    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: est.txt", FileMode.OpenOrCreate);这个只是一个地址而已,= null 是没啥用的。如果等于null 反倒影响GC回收了。

    综上,得出浅显结论:

    1、Close负责关闭业务,Dispose负责销毁对象。Dispose会负责Close的一切事务,额外还有销毁对象的工作,即Dispose包含Close

    2、当有明确需求的时候,不要混用二者

    3、两者连在一起用没什么意义。要么关闭以便再次使用,要么销毁不再使用。 

    如各位有更好见解,欢迎指正。

  • 相关阅读:
    文件包含漏洞
    任意文件上传
    改变弱口令威胁,从意识开始
    Node.js学习笔记10--Express搭网站(2)
    Node.js学习笔记9——Express框架
    Node.js学习笔记8
    Node.js学习笔记7-文件系统
    node.js学习笔记6
    node.js学习笔记5——核心模块1
    Node.js学习4
  • 原文地址:https://www.cnblogs.com/weixiao520/p/3534062.html
Copyright © 2020-2023  润新知