如果 using 块返回,IDisposable 是否会被释放?

2023-12-23

例如

using(var something = GetSomething())
{
    something.DoSomething();
    if(something.IsX()) return true;
}
return false;

是的,一点没错。这Dispose方法被调用但是using语句会被执行,除非整个进程突然终止。最常见的情况是:

  • A return块内
  • 块内抛出(但未捕获)异常
  • 自然到达区块的末端

基本上是一个using语句主要是语法糖try/finally块 - 和finally具有所有相同的属性。

编辑:来自第 8.13 节C# 4 规范 http://download.microsoft.com/download/0/B/D/0BDA894F-2CCD-4C2C-B5A7-4EB1171962E5/CSharp%20Language%20Specification.doc:

A using声明分为三个部分:获取、使用和处置。资源的使用隐式包含在try声明包含一个finally条款。这finally子句处置资源。

The finally声明在规范第 8.10 节中描述:

的声明finally当控制权离开时,块总是被执行try陈述。无论控制权转移是作为正常执行的结果发生的,都是如此;作为执行的结果break, continue, goto or return陈述;或者作为传播异常的结果try陈述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 using 块返回,IDisposable 是否会被释放? 的相关文章

随机推荐