有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. 当返回值时引用类型时,会影响到返回值。

你可能感兴趣的:(.Net/C#基础,finally,return)