发布时间:2017-11-28编辑:佚名阅读(1825)
除了函数出现system.exit(0)终止虚拟机,finally中的代码一定执行,return语句会等待finally的执行;如果是值传递,finally中改变的值对try或catch块中return返回的值无影响;如果是引用类型参数(地址传递或对象),finally中的值改变对return会产生影响。
如果是值类型,压栈的就是经过复制的参数值,如果是引用类型,那么进栈的只是一个引用,这也就是我们所熟悉的,传递值类型时,函数内修改参数值不会影响函数外,而引用类型的话则会影响。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace finallyReturn { class Program { static void Main(string[] args) { int num= Test_Finally_Return.Test(); Console.WriteLine("num={0}",num); Console.ReadKey(); } } class Test_Finally_Return { public static int Test() { int num =0; try { num = 1; throw new Exception("手动控制抛出异常"); //若将throw注释掉,通过try中return返回,即正常执行时会不会执行finally,答案是会执行,但函数返回-1。 //return -1; } catch (Exception e) { Console.WriteLine(e.Message); return num; //输出num=1;相信很多人会认为返回2,这里面相当于是变量copy,finally中的变量改变对return值无影响。 } finally { num++;//执行了,num=2 Console.WriteLine("我在Finally中num={0}",num); //return 5;//finall中不能包含return语句,否则会报错 } } } }
结论:
在try或catch语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try或catch中先把要返回的结果存放到不同于i的局部变量中去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量i进行了改变,但是不会影响返回结果。
0人
0人
0人
0人