• using强制对象清理资源 【转】


    转 http://www.cnblogs.com/Legolas/p/detail-of-using.html

    using肯定所有人都用过,最简单的就是使用using引入命名空间,然后就是引入别名,简化输入,本文主要介绍第三种用法,即用using强制对象清理资源。

        先看下面这段代码:

        

    复制代码
            try
                {
                    using (SqlConnection con = new SqlConnection(source))
                    {
                        //open connection
                        con.Open();
                        //do something
                        con.Close();
                    }
                }
                catch (SqlException e) 
                {
                    //log the exception
                }    
    复制代码

        代码很简单,就不多说了,这里用using的目的就是为了保证数据库连接这个“稀缺”资源,在使用完毕之后能够立即关闭,即使在using语句块执行时发生异常,在退出时,依然会将该连接关闭。

        用法就是这样,很简单,下面说一下这段代码执行的时候CLR为我们做了哪些工作。

      IDisposable接口

        必须是实现了IDisposable接口的对象才可以使用using来管理。而实现了该接口就意味着需要实现其中的Dispose方法,这个方法就是在using语句块执行结束之后要执行的方法,对于对象资源的处理也在这个方法中进行。下图为上述代码中using语句块对应的IL代码,从图中红色线条圈出的部分可以看出,using语句块最后自动执行了对象的Dispose方法。

        

        

        如何保证using语句块执行结束之后,Dispose方法一定能执行呢,看一下上图中蓝色线条圈出的两处,大家就会明白,这里CLR也没有多高明的实现,依旧是try...finally语句块来保证的,只是这个try....finally语句块不需要我们添加,CLR会自动为我们处理。

        

        

      Dispose与终结器(或者叫Finalize方法 or 析构函数)

        Dispose方法可以主动调用(如通过using或close方法),从而尽快的释放本地资源,而Finalize则是需要等到GC回收该对象的时候才会被调用,一般Finalize方法用来确保当托管对象的内存被释放时,本地资源不会泄露。

        

      Dispose与close方法

        Dispose与close方法的区别:一般情况下如果实现了IDisposable接口,那么建议在实现close方法的时候调用Dispose方法,另外在using语句块结束时CLR会自动调用对象的Dispose方法。它们都是为了清理对象中包装的本地资源,然后等待垃圾回收器自动回收该对象本身占用的内存。

         

        说了半天其实还是一句话:借来的资源,用完了千万赶紧赶紧还回去啊,地主家没有余粮了!

  • 相关阅读:
    unittest中常用的几个断言
    unittest中忽略某些测试用例的执行
    unittest测试套件
    unittest中的Empty suite错误
    找水王
    SCRUM冲刺day04
    SCRUM冲刺day03
    SCRUM冲刺day02
    SCRUM冲刺day01
    学习进度条week13
  • 原文地址:https://www.cnblogs.com/mmbbflyer/p/7595550.html
Copyright © 2020-2023  润新知