李威 さぽている

          小說翻譯,日語相關轉移至http://blog.hjenglish.com/liwei

          try-finally,return的執行順序小析~

          項目中一個try-finally語句中有return,不明白執行的順序,于是搜索了一番。
          http://www.usdprofits.com/finally-return-t344073.htm
          雖然回答的是JAVA的,但也有借鑒作用。
          ===================================================
          首先執行finally,然后才執行return;
          如果finally里面有return,try中的return不會再執行;
          如果try中有了異常,return也不執行;
          ps:異常實際上也是一種返回值
          ===================================================
          http://fanyaojun.bokee.com/126611.html
          有一段程序顯示先執行try,再finally最后return。
          http://www.blog.edu.cn/user1/16293/archives/2006/1248335.shtml
          分析了IL代碼,指出了比較根本性的原因。

          但我寫了一個程序卻出現了一個怪問題。
          主程序清單如下:

          static ? void ?Main( string []?args)
          ????????
          {
          ????????????Console.WriteLine(TestFR().ToString());
          ????????}


          ????????
          static ? int ?TestFR()
          ????????
          {
          ????????????
          int ?i? = ? 1 ;
          ????????????
          try
          ????????????
          {
          ????????????????i?
          = ? 2 ;
          ????????????????
          return ?i;
          ????????????}

          ????????????
          ????????????
          finally
          ????????????
          {
          ????????????????i?
          = ? 3 ;
          ????????????????Console.WriteLine(
          " finally?block?executed. " );
          ????????????}

          ????????}



          它顯示的是什么呢?
          按照前面講的,先寫“finally block executed.”再輸出3
          可實驗結果卻是
          finally block executed.
          2

          怎么回事?我也來分析下IL代碼~~以下是TestFR()的~

          .method? private ?hidebysig? static ?int32??TestFR()?cil?managed
          {
          ??
          // ?コード?サイズ???????29?(0x1d)
          ??.maxstack?? 1
          ??.locals?init?([
          0 ]?int32?i,
          ???????????[
          1 ]?int32?CS$ 1 $ 0000 )
          ??IL_0000:??nop
          ??IL_0001:??ldc.i4.
          1
          ??IL_0002:??stloc.
          0
          ??.
          try
          ??
          {
          ????IL_0003:??nop
          ????IL_0004:??ldc.i4.
          2
          ????IL_0005:??stloc.
          0
          ????IL_0006:??ldloc.
          0
          ????IL_0007:??stloc.
          1
          ????IL_0008:??leave.s????IL_001a
          ??}
          ?? // ?end?.try
          ?? finally
          ??
          {
          ????IL_000a:??nop
          ????IL_000b:??ldc.i4.
          3
          ????IL_000c:??stloc.
          0
          ????IL_000d:??ldstr??????
          " finally?block?executed. "
          ????IL_0012:??call???????
          void ?[mscorlib]System.Console::WriteLine( string )
          ????IL_0017:??nop
          ????IL_0018:??nop
          ????IL_0019:??endfinally
          ??}
          ?? // ?end?handler
          ??IL_001a:??nop
          ??IL_001b:??ldloc.
          1
          ??IL_001c:??ret
          }
          ? // ?end?of?method?Program::TestFR


          這里涉及到3個存儲區:堆棧,局部變量區,計算堆棧。至于它們的區別,我不是很清楚,有人知道的話,告訴我吧。
          01句(以下同樣只簡稱后兩位IL_0001)將數字1放到堆棧,02句彈出到局部變量0中,對應的語句就是i = 1;try中幾句是將數字2放到堆棧,再彈出到局部變量0,06句將局部變量0加載到計算堆棧。07句將其彈出到局部變量1,因為只有計算堆棧里有數據,所以彈的是計算堆棧的值。08跳到1a去,但不能跳過finally句。
          finally句中將數字3放到局部變量0中,再顯示字符串。
          而后,關鍵的地方就到了。1b句將局部變量1加載到計算堆棧,再由ret返回值。
          這里,為什么將局部變量1也就是數字2返回呢?不可理解呀~

          posted on 2006-09-13 19:06 李威 閱讀(3947) 評論(1)  編輯  收藏

          評論

          # re: try-finally,return的執行順序小析~ 2006-09-14 18:40 李威

          問題似乎解決了~~
          將那個程序作些小的修改(只寫修改部分了)
          =================================
          int i = 1 ;
          int b;
          try
          {
          i = 2 ;
          return b = i;
          }
          ==================================
          這樣,在return處設斷點就可以看明白了~return后面的語句在finally之前就執行了,b=2;也就是返回值已經確定,保存在特定區域了。finally的語句執行后b仍等于2,對返回值不起作用了。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 墨江| 石城县| 沂南县| 密山市| 金阳县| 温泉县| 大余县| 巴塘县| 施秉县| 宜君县| 衡南县| 监利县| 青州市| 海安县| 新巴尔虎左旗| 永新县| 太保市| 英德市| 方城县| 启东市| 金沙县| 望江县| 礼泉县| 安达市| 山丹县| 邯郸市| 岳阳县| 泸西县| 拜泉县| 杂多县| 东港市| 盐城市| 海盐县| 绥芬河市| 吉安县| 民权县| 塔河县| 东山县| 开化县| 化隆| 日土县|