這是一道面試題,首先finally{}裡面的code肯定是會執行的,至於在return前還是後, 看答案說的是在return後執行,我覺得不對,百度了一下,有說return前的,有說return後的,還有return中間執行的。遂做了一個小測試如下: 測試結果如下: 所以我覺得finally{}裡面 ...
這是一道面試題,首先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的關係也講得很明白了,這一天天的真是受教了。