如果从C#中的try或catch块返回,是否会执行finally块? 如果是这样,在返回之前或之后?

没有内容可用!

是的,执行finally块,但是流离开try块 – 无论是到达结尾,返回还是抛出exception。

从C#4规范,第8.10节:

当控制离开try语句时,总是执行finally块的语句。 无论控制转移是作为正常执行的结果发生,还是由于执行break,continue,goto或return语句,或者是由于将exception传播出try语句而导致的。

(当然,第8.10节有更详细的内容。)

请注意,返回值是执行finally块之前确定的,所以如果你这样做:

 int Test() { int result = 4; try { return result; } finally { // Attempt to subvert the result result = 1; } } 

…仍将返回值4,而不是1 – finally块中的赋值将不起作用。

将始终执行finally块,这将在从方法返回之前发生,因此您可以安全地编写如下代码:

 try { return "foo"; } finally { // This will always be invoked } 

或者如果您正在使用一次性资源:

 using (var foo = GetFoo()) { // foo is guaranteed to be disposed even if an exception is thrown return foo.Bar(); } 

对于.NET从Windowsinheritance的两遍exception处理,您无法准确地说finally块在控制权传递给调用者之前执行。

finally块将在更多嵌套调用帧中的finally块之后执行,并且在最终块之前执行,并且在较少嵌套的调用帧中执行catch块,这与在返回之前运行的finally块一致。 但是抛出点和捕获点之间的所有exceptionfilter都将在任何finally块之前运行,这意味着在出现exception时,一些调用者代码可以在finally块之前运行。

当控件正常离开块时(没有抛出exception),则最终在控制返回调用者之前运行。

如果从C-Sharp中的try或catch块返回,是否会执行finally块?

如果它会,返回之前或之后?

之前