示例解释 C# using 释放资源

作者:vkvi 来源:千一网络(原创) 日期:2017-2-27

能用 using 的类,都是实现了 IDispose 接口的类。

看看下面的代码:

故意放一句出错的代码——除以 0。

由于没有加 try、catch,所以肯定会抛出异常,但是由于我们使用了 using,C# 在抛出异常前,会先把 Conn_Disposed 执行了,然后再抛出异常。

顺便注意一下:

  • 由于抛出异常,所以 conn.Close() 这句并没有被调用,不过不用担心,using 自动执行 conn.Dispose(),Dispose() 会调用 Close()。
  • 若没有抛出异常,conn.Close() 与 conn.Dispose() 将都被执行,这并不会出错。
  • conn.Close() 在这里的确可以省略,我写出来大概是出于我的习惯吧。

using 为我们带来了简便的写法,否则我们可能需要这么写:

代码就会比较复杂。

有人说,第一段代码有啥意思呀,都没防住除以 0 的异常,最终为了程序稳健,还不是要加 try,的确,但是我们要搞清楚 using 的目的,using 是一把保险锁,万一我们哪里没有加 try,哪里触发了异常,导致程序终止,非托管资源仍然能够得到释放。

还有,如果 using 中有 return 或者 Response.End(),我们也完全可以放心,它会在 return、Response.End() 之前调用 Dispose() 的。

有人说,using 不要嵌套,因为内层如果发生了异常,外层的 using 发挥不了作用。这是错误的说法。

看代码:

先看到对话框:cmd disposed

再看到对话框:conn disposed

最后是异常对话框。

你前面那位网友看了:SQL 触发器-慎用触发器

▲▲▲嘿,欢迎转载传播本站原创文章,尽量保留来源噢。▲▲▲

文章评论
标题:必填
内容:
本站永远终止与捏造“罪名”不支付广告费的某度联盟合作。
vkvi
vkvi

作者简介: vkvi,致力于 .NET Web 开发、移动开发的技术推广,在 .NET、SQL Server、Windows Server 等方面有深入研究和丰富经验,10 年间共计撰写文章 4000 余篇。 主持金融、国土、农业、电商等多个行业项目执行, 推行“技术提升生产力、人心决定成功率”的管理理论。 联系他