日期:2014-05-19  浏览次数:20786 次

using的疑问
使用using时,如果被using包含的代码抛出了异常,那using还会自动回收资源吗。望高手解答一下

using(SqlConnection   conn   =   new   SqlConnection(ConnString))
{
        conn.open();
        SqlCommand   cmd   =   new   SqlCommand(StrSql,conn);
        cmd.ExecuteNonQuery();
}

如上述代码,如果cmd.ExecuteNonQuery();执行出错,抛出了异常,那using还会回收资源吗,还是需要在using里使用try来捕获错误,然后手动来释放资源。


------解决方案--------------------
会,无论任何方式离开语句块,using建立的对象都会被释放。包括语句块结束、return、异常等
------解决方案--------------------
不需要写了,所谓释放内存就是继承IDispose接口,如楼主所述,当你的类继承了IDispose接口,数据库连接在使用后会自动销毁,但是如果发生异常,这个连接就会一直存在内存里只到垃圾收集器回收,用了using(SqlConnection conn = new SqlConnection(ConnString))
那么即使发生异常这个连接也会马上销毁。
------解决方案--------------------
使用了using就不需要写try..catch了,如果连接发生异常,离开using语句块这个连接就被销毁了
------解决方案--------------------
会。
所有实例化的对象都必须实现 System.IDisposable 接口;当到达using 语句的末尾,或者如果语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句,退出 using 语句时在创建的实例对象上调用 Dispose,释放资源。
------解决方案--------------------
using 和FINALLY{}的效果是一样,一个是隐式一个是显示关闭连接
------解决方案--------------------
顶楼上

using 和FINALLY{}差不多的功效~!
------解决方案--------------------
会,相当于finaly块,无论是否出现异常,都会给你清理资源