李威 さぽている

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

          try-finally,return的執(zhí)行順序小析~

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

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

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

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

          評論

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

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


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 潢川县| 津市市| 盐城市| 简阳市| 旺苍县| 滦平县| 诸城市| 玉山县| 滕州市| 综艺| 股票| 德阳市| 襄樊市| 武城县| 新民市| 天峻县| 湖南省| 公安县| 隆化县| 青神县| 元氏县| 拉萨市| 高密市| 资兴市| 南投县| 遵化市| 临漳县| 如皋市| 涟源市| 革吉县| 扎赉特旗| 望城县| 昭通市| 台中市| 平湖市| 长海县| 肃宁县| 岚皋县| 普格县| 师宗县| 崇明县|