<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    李威 さぽている

    小說翻譯,日語相關轉移至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 李威 閱讀(3945) 評論(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,對返回值不起作用了。  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 黄a大片av永久免费| 免费人成动漫在线播放r18| 亚洲欧洲自拍拍偷精品 美利坚 | 97性无码区免费| 成全视频免费观看在线看| 国产AV日韩A∨亚洲AV电影 | 91香蕉成人免费网站| baoyu122.永久免费视频| 猫咪免费人成在线网站| 亚洲一区二区观看播放| 亚洲精品免费在线| 亚洲精品免费视频| 亚洲V无码一区二区三区四区观看| 免费人成在线观看视频播放| 在线播放免费播放av片| 日本妇人成熟免费中文字幕| 人妻无码一区二区三区免费| 最新国产乱人伦偷精品免费网站 | 亚洲国产精品日韩专区AV| 日韩免费观看视频| 韩国二级毛片免费播放| 久久精品网站免费观看| 国产一卡二卡3卡四卡免费| 最近最新高清免费中文字幕| 无码成A毛片免费| 国产精品白浆在线观看免费| 中文在线免费看视频| 精品国产污污免费网站入口| 亚洲一区二区三区免费| 亚欧国产一级在线免费| 黄床大片免费30分钟国产精品| 精品久久久久久无码免费| 中文字幕永久免费| 久久久久久免费一区二区三区| 免费国产99久久久香蕉| 久操免费在线观看| free哆啪啪免费永久| 青青草免费在线视频| 女人张开腿给人桶免费视频| 日韩精品视频免费观看| 国产一区二区三区在线观看免费|