1 背景
当然是面试被问到了。。。。
2 记录一下
这篇文章主要讲解两个问题:
- 在try中有return或者catch中有return的时候,finally中的代码是否会执行?
- 如果会被执行,是在什么时候执行的呢?
先看第一个问题,我们也准备了一点代码。
static void Main(string[] args)
{
Foo(50);
Foo(200);
}
static int Foo(int a)
{
try
{
if (a > 100)
throw new ArgumentException();
return a;
}
catch (Exception)
{
return a + 100;
}
finally
{
Console.WriteLine("i am finally");
}
}
上述代码输出的结果为:
i am finally
i am finally
所以,第一个问题的答案显然易见,无论什么情况,finally中的代码块都会被执行。那么我们再来看第二个问题。
static void Main(string[] args)
{
Console.WriteLine(Foo(50));
Console.WriteLine(Foo(200));
}
static int Foo(int a)
{
try
{
if (a > 100)
throw new ArgumentException();
return a;
}
catch (Exception)
{
return a + 100;
}
finally
{
a += 999;
}
}
上述代码输出的结果为:
50
300
然后我们结合VS调试,你会发现:
finally是在return后面的表达式运算完之后执行的,在执行完return时,程序并没有跳出,而是进入到finally中继续执行。
通过最后的输出结果,我们还发现:
在finally中我们对返回值进行了修改,但是最终的返回值不受影响。
3 结论
- 无论什么情况(try和catch中有return或者try中有异常),finally都是会被执行的。
- finally是在return后面的表达式运算完之后执行的,在执行完return时,并没有跳出,而是进行到finally中继续执行。
- 如果在finally中对返回值进行了重新赋值,分两种情况:
- 当返回值为值类型的时候(包括string,因为它是一个特殊的值引用类型),返回值不受影响,就是在try catch的时候就已经确定了。
- 当返回值时引用类型时,会影响到返回值。