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块中的赋值将不起作用.


Dar*_*rov 6

将始终执行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)