有return的时候,finally块中代码还会执行吗

1 背景

当然是面试被问到了。。。。

2 记录一下

这篇文章主要讲解两个问题:

  1. 在try中有return或者catch中有return的时候,finally中的代码是否会执行?
  2. 如果会被执行,是在什么时候执行的呢?

先看第一个问题,我们也准备了一点代码。

    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 结论

  1. 无论什么情况(try和catch中有return或者try中有异常),finally都是会被执行的。
  2. finally是在return后面的表达式运算完之后执行的,在执行完return时,并没有跳出,而是进行到finally中继续执行。
  3. 如果在finally中对返回值进行了重新赋值,分两种情况:
  4. 当返回值为值类型的时候(包括string,因为它是一个特殊的值引用类型),返回值不受影响,就是在try catch的时候就已经确定了。
  5. 当返回值时引用类型时,会影响到返回值。
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值