<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,對返回值不起作用了。  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 风间由美在线亚洲一区| 久久精品国产亚洲av高清漫画| 亚洲噜噜噜噜噜影院在线播放 | 毛片在线全部免费观看| ZZIJZZIJ亚洲日本少妇JIZJIZ| 亚洲国产精华液2020| 成人毛片免费观看视频| 亚洲人妖女同在线播放| 国产成人精品久久免费动漫| 亚洲天堂电影在线观看| 精品福利一区二区三区免费视频| 337p日本欧洲亚洲大胆精品555588 | 亚洲国产成人久久综合野外| eeuss草民免费| 亚洲视频在线观看一区| 免费福利网站在线观看| 特级aaaaaaaaa毛片免费视频| 成人免费无码H在线观看不卡| 久久亚洲中文字幕精品有坂深雪| 亚洲国产一区明星换脸| 1000部国产成人免费视频| 成人免费观看男女羞羞视频| 久久91亚洲人成电影网站| 91青青青国产在观免费影视| 亚洲国产aⅴ成人精品无吗| 亚洲av永久无码精品古装片| 四虎影院免费视频| 精品在线免费观看| 国产精品亚洲专区无码牛牛| 亚洲一级二级三级不卡| 四虎永久精品免费观看| 91av在线免费视频| a级毛片毛片免费观看永久| 亚洲av无码专区在线观看亚| 久久狠狠高潮亚洲精品| 国产精品成人免费综合| 91免费国产在线观看| 1000部拍拍拍18勿入免费视频下载 | 亚洲人妻av伦理| 日本媚薬痉挛在线观看免费| 一色屋成人免费精品网站|