这是一道面试题,首先finally{}里面的code肯定是会执行的,至于在return前还是后,
看答案说的是在return后执行,我觉得不对,百度了一下,有说return前的,有说return后的,还有return中间执行的。遂做了一个小测试如下:
static void Main(string[] args){//测试Test();System.Console.WriteLine("结束了");System.Console.ReadLine();}/// <summary>/// 测试/// </summary>/// <returns></returns>private static int Test(){try{System.Console.WriteLine("好,开始了");return ReturnInt();}catch (Exception exception){System.Console.WriteLine("我是异常");throw;}finally{System.Console.WriteLine("我是finally");}}/// <summary>/// 返回数字/// </summary>/// <returns></returns>private static int ReturnInt(){System.Console.WriteLine("我是return");return 1;}
测试结果如下:
所以我觉得finally{}里面的code是在return之后执行的。
此测试较粗糙,如有其它方法证明,望告知。
----------------------------------------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------------------------------------------------------------------
之前的测试果然很粗糙,搞错了一个概念,return到底是在什么时候才算执行,什么时候执行完。上面打印“我是return”的时候,我以为是return执行完了,其实那个时候只是去准备return的返回值去了,并没有真正的返回“1”并跳出Test()方法,准备好返回值之后,接着去执行finally{}里面的code,打印了“我是finally”,最后Test()方法才算执行完,并真正的返回(return)“1”到main里面。
按照@以后会觉得昵称很幼稚 老哥的提醒,修改了一下main()里面的代码,
static void Main(string[] args){//测试Console.WriteLine("Test结果:" + Test());System.Console.WriteLine("结束了");System.Console.ReadLine();}
结果如下:
所以finally{}里面的code应该是在return之前执行的。
在http://bbs.csdn.net/topics/60474475 此贴中,五楼的老哥的话,“函数应该是栈调用,如果先执行return ,哪不是退到上个栈了,怎么调用finally, 所以我觉得先调用finally”,
在http://blog.csdn.net/gaoyuanfeng/article/details/4064388 文章中,finally与return的关系也讲得很明白了,这一天天的真是受教了。