使用using时,如果被using包含的代码抛出了异常,那using还会自动回收资源吗。望高手解答一下using(SqlConnection conn = new SqlConnection(ConnString))
{
    conn.open();
    SqlCommand cmd = new SqlCommand(StrSql,conn);
    cmd.ExecuteNonQuery();
}如上述代码,如果cmd.ExecuteNonQuery();执行出错,抛出了异常,那using还会回收资源吗,还是需要在using里使用try来捕获错误,然后手动来释放资源。

解决方案 »

  1.   

    会,无论任何方式离开语句块,using建立的对象都会被释放。包括语句块结束、return、异常等
      

  2.   

    不需要写了,所谓释放内存就是继承IDispose接口,如楼主所述,当你的类继承了IDispose接口,数据库连接在使用后会自动销毁,但是如果发生异常,这个连接就会一直存在内存里只到垃圾收集器回收,用了using(SqlConnection conn = new SqlConnection(ConnString))
    那么即使发生异常这个连接也会马上销毁。
      

  3.   

    会,写Dispose()方法的人应该要处理这些事情
      

  4.   

    使用了using就不需要写try..catch了,如果连接发生异常,离开using语句块这个连接就被销毁了
      

  5.   

    会。
    所有实例化的对象都必须实现 System.IDisposable 接口;当到达using 语句的末尾,或者如果语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句,退出 using 语句时在创建的实例对象上调用 Dispose,释放资源。
      

  6.   

    C# 通过 .NET Framework 公共语言运行库 (CLR) 来自动释放用来存储不再需要的对象的内存。内存的释放具有不确定性;一旦 CLR 决定执行垃圾回收,就会释放内存。但是,通常最好尽快释放诸如文件句柄和网络连接这样的有限资源。 using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出 using 语句。
      

  7.   

    当然会,这就是使用using的方便之处
      

  8.   

    using 和FINALLY{}的效果是一样,一个是隐式一个是显示关闭连接
      

  9.   

    顶楼上using 和FINALLY{}差不多的功效~!
      

  10.   

    会,相当于finaly块,无论是否出现异常,都会给你清理资源
      

  11.   

    来自 MSND 的解释http://msdn2.microsoft.com/zh-cn/library/yh598w02(VS.80).aspxC# 通过 .NET Framework 公共语言运行库 (CLR) 来自动释放用来存储不再需要的对象的内存。内存的释放具有不确定性;一旦 CLR 决定执行垃圾回收,就会释放内存。但是,通常最好尽快释放诸如文件句柄和网络连接这样的有限资源。 using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出 using 语句。
      

  12.   

    放到using里的语句块,是不是用完就由垃圾回收器管理了啊?