如果使用块返回,是否会丢弃IDisposable?

例如

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

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

  • 块内return
  • 块内抛出(并未捕获)exception
  • 自然地到达块的尽头

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

编辑:从C#4规范的第8.13节:

using声明分为三个部分:获取,使用和处置。 资源的使用隐式包含在包含finally子句的try语句中。 这个finally子句处理资源。

finally语句在规范的8.10节中描述:

当控制离开try语句时,总是执行finally块的语句。 无论控制转移是否正常执行,都是如此; 执行breakcontinuegotoreturn语句的结果; 或者是从try语句中传播exception的结果。

是。

using是一个try / finally块的语法糖 :

using语句确保即使在对象上调用方法时发生exception,也会调用Dispose。 您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果;

finally块的文档中 :

catch用于处理语句块中发生的exception,而最终用于保证语句代码块的执行,而不管前面的try块是如何退出的。

因此, using转换为try/finally ,在finally部分使用.Dispose() ,确保无论try / catch中发生什么,它总是被执行。

是的,using是一个编译器function,可以扩展为

 try { ... return ...; } finally { foo.Dispose(); } 

据我所知,使用块一旦退出范围就会处理掉它。

例如,当返回true时,下一个语句超出范围,因此将处理该变量。

我认为一旦控制将失去{} dispose将被调用,所以简而言之Yes

尚未提到的一点是,虽然“using”块中的“return”将在受控变量上调用Dispose,但迭代器中“using”块内的“yield return”将不会处理受控变量,除非IEnumerator与迭代器关联的是Disposed。