例如
using(var something = GetSomething())
{
something.DoSomething();
if(something.IsX()) return true;
}
return false;
答案 0 :(得分:8)
是的,绝对的。调用Dispose
方法,但执行using
语句,除非它是一个突然的全进程终止。最常见的情况是:
return
基本上,using
语句主要是try
/ finally
块的语法糖,而finally
具有所有相同的属性。
编辑:来自C# 4 specification的第8.13节:
using
声明被分为三个部分:获取,使用和处置。资源的使用隐式包含在包含try
子句的finally
语句中。此finally
子句处理资源。
finally
语句在规范8.10节中描述:
当控件离开
finally
语句时,始终会执行try
块的语句。无论控制转移是否是正常执行的结果,都是如此;执行break
,continue
,goto
或return
声明的结果;或者是从try
语句中传播异常的结果。
答案 1 :(得分:2)
是
using
is syntactic sugar for a try/finally block:
using语句确保了这一点 即使异常,也会调用Dispose 在调用方法时发生 在对象上。你可以实现 通过放置对象得到相同的结果 在try块内,然后调用 处理finally块;
In the documentation on the finally
block:
而catch用于处理 声明中出现的异常 块,最后是用来保证一个 语句代码块执行 不管前面的尝试如何 阻止退出。
因此,using
在try/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。