Jon*_*eet 45
是的,finally块被执行但是流离开try块 - 无论是到达结束,返回还是抛出异常.
从C#4规范,第8.10节:
当控制离开try语句时,总是执行finally块的语句.无论控制转移是作为正常执行的结果发生,还是由于执行break,continue,goto或return语句,或者是由于将异常传播出try语句而导致的.
(当然,第8.10节有更详细的内容.)
请注意,返回值是在执行finally块之前确定的,所以如果你这样做:
int Test()
{
int result = 4;
try
{
return result;
}
finally
{
// Attempt to subvert the result
result = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
...仍将返回值4,而不是1 - finally块中的赋值将不起作用.
将始终执行finally块,这将在从方法返回之前发生,因此您可以安全地编写如下代码:
try {
return "foo";
} finally {
// This will always be invoked
}
Run Code Online (Sandbox Code Playgroud)
或者如果您正在使用一次性资源:
using (var foo = GetFoo())
{
// foo is guaranteed to be disposed even if an exception is thrown
return foo.Bar();
}
Run Code Online (Sandbox Code Playgroud)