• "finally" vs "return"?


    先看如下代码:
            static int Test()
            {
                int val = 1;
                try
                {
                    return val;
                }
                finally
                {
                    val = 2;
                }
            }

    还有这个:
    static int s_val;          static int Test()          {             s_val = 1;             try             {                return s_val;             }             finally             {             s_val = 2;             }        }

    方法执行完后会返回哪个值呢?finally里的代码会不会执行呢?其实这都是老问题了,以前我都编码试过,不过现在又忘了=_=b...
    废话少说,看第一个的IL代码(没看过IL也无所谓,下面有注释,应该好懂):
    .method private hidebysig static int32 Test() cil managed { .maxstack 1 .locals init ([0] int32 val, [1] int32 CS$1$0000 // $ret ) IL_0000: nop // 下面两句是把val赋值 int val = 1; IL_0001: ldc.i4.1 //ldc.i4.1就是load constant int32 1到栈顶 IL_0002: stloc.0 //set local 0,把栈顶值赋给本地变量[0],其实就是val // 开始try .try { IL_0003: nop IL_0004: ldloc.0 // 把本地变量[0](val)的值丢到栈顶 IL_0005: stloc.1 // 赋给返回值 IL_0006: leave.s IL_000d //无条件跳转到编号为IL_000d语句 } // try完 finally //开始finally { IL_0008: nop //下面几局是finally里的 val = 2; IL_0009: ldc.i4.2 IL_000a: stloc.0 // val IL_000b: nop IL_000c: endfinally
    } // finally完 IL_000d: nop // 传说中的IL_000d,但是是no operation IL_000e: ldloc.1 // 把返回值载入到栈顶
    IL_000f: ret //正式return } // end of method Program::Test

    如果看懂了上面的东西,就应该知道返回的是初始的val, 也就是1。
    但是。。。 finally里的东西执行了没有呢?其实是在返回之后由CLR执行了。。呃。。方法都返回了还能执行啊。
    怎么证明呢,其实由第二个例子很容易验证,第二个方法返回的依然是1,但是方法执行完后静态变量s_val已经变成了2。
    这种代码一般人都不知道会发生什么,所以呢,作为好的Programmer,这种让人容易迷糊的代码千万别写。






    原文:http://blogs.msdn.com/jmstall/archive/2006/10/05/finally_5F00_vs_5F00_return.aspx

  • 相关阅读:
    django-替代为自定义的User model
    python *args 和 ** kwargs
    MySQL:性能优化
    MySQL:常用的数据模型
    MySQL:存储过程和函数
    MySQL:用户管理
    MySQL:索引
    MySQL:基础知识
    Linux:NFS配置
    Linux:Apache安装与启动
  • 原文地址:https://www.cnblogs.com/Dah/p/522168.html
Copyright © 2020-2023  润新知