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

时间:2011-06-15 10:26:48

标签: c# .net return idisposable using

例如

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

6 个答案:

答案 0 :(得分:8)

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

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

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

编辑:来自C# 4 specification的第8.13节:

  

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

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

  

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

答案 1 :(得分:2)

using is syntactic sugar for a try/finally block

  

using语句确保了这一点   即使异常,也会调用Dispose   在调用方法时发生   在对象上。你可以实现   通过放置对象得到相同的结果   在try块内,然后调用   处理finally块;

In the documentation on the finally block

  

而catch用于处理   声明中出现的异常   块,最后是用来保证一个   语句代码块执行   不管前面的尝试如何   阻止退出。

因此,usingtry/finally部分中被.Dispose()转换为finally,确保无论try / catch中发生什么,它始终都会被执行

答案 2 :(得分:1)

是的,using是一个编译器功能,扩展为

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

答案 3 :(得分:0)

据我所知,使用块会在退出范围时立即处理该对象。

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

答案 4 :(得分:0)

我认为只要控件退出{},就会调用dispose Yes

答案 5 :(得分:0)

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