try{}里有一個 return 語句,那么緊跟在這個 try 后的 finally {}里的 code 會 不會被執行,什么時候被執行,在 return 前還是后?


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM