這是一道面試題,首先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的關系也講得很明白了,這一天天的真是受教了。