[已解决问题] 求几道小题目的答案,发现网上答案有些错误?
提问时间: 2008-07-13 18:36
悬赏分:10 浏览:168 次

1..try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:会执行,在return前执行。

但是我调试时,是在return后执行的,这是我的调试代码:

YeShu.BLL.Dictionary_Type bll = new YeShu.BLL.Dictionary_Type();
        try
        {

            int i = bll.Add(TextBox1.Text.Trim());
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "aa", " + "')", true);
            return 2;
        }

        finally
        {
            bll = null;
        }

2.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String?
答:switchexpr1)中,expr1是一个整数表达式。因此传递给 switch  case 语句的参数应该是 int short char 或者 bytelong,string 都不能作用于swtich

但是我测试时long和string都可以,测试代码:

private void bb(string str)
    {
        switch (str)
        {
            case "1":
                Response.Write("aaa1");
                break;
            case "2":
                Response.Write("aaa2");
                break;
            default:
                Response.Write("aaat");
                break;
        }
    }

到底是我测试出错了,还是答案是错误的

提问者:chunfeng - 初学一级
最佳答案
第一个问题,return 确实是在fininal后执行,答案是对的,看下面代码: static int Test() { int ret = 0; try { return ret; } finally { ret = 1; } } 汇编代码如下 .method private hidebysig static int32 Test() cil managed { // Code size 16 (0x10) .maxstack 1 .locals init ([0] int32 'ret', [1] int32 CS$1$0000) IL_0000: nop IL_0001: ldc.i4.0 IL_0002: stloc.0 .try { IL_0003: nop IL_0004: ldloc.0 IL_0005: stloc.1 IL_0006: leave.s IL_000d } // end .try finally { IL_0008: nop IL_0009: ldc.i4.1 IL_000a: stloc.0 IL_000b: nop IL_000c: endfinally } // end handler IL_000d: nop IL_000e: ldloc.1 IL_000f: ret } // end of method Program::Test 这里,你可以看到在finally之后才执行 IL_000f: ret 但从程序结果来看,似乎是return在finally之前,因为你看 IL_0004: ldloc.0 IL_0005: stloc.1 这两句发生在finally之前,在此时已经将返回值写入了堆栈,所以在 finally中再对局部变量ret复制,返回值不会改变。但返回值写入堆栈, 并不代表函数已经返回,函数只有在 IL_000f: ret 这一句才返回, 函数返回的标志是将IP指针从堆栈中弹出,以便程序可以执行函数的 下一条语句。 第二道题,答案错了,对于.net来说 String , long等都可以用在switch里面, 对于C++则不可以。
2008/7/14 8:13:16 回答者:eaglet
其它回答(2)
finally 在return后也会执行的. 整型和字符型都可以~~
1个月前   回答者:沙加 - 老鸟四级
看反编译的代码那是最正确的,因为可以看到真正的流程! 另外第2题C#对Switch没有那么多限制。。倒是我记得Java的限制也很多!
1个月前   回答者:Allie - 小虾三级
评论
1个月前   chunfeng :
但是我调试时,是在return后执行的,为什么呢
1个月前   chunfeng :
是不是一定要看汇编代码,才能得出正确答案
1个月前   eaglet :
调试高级语言代码,往往不能得到正确流程,存在很多情况,比如某些优化也会导致流程不一样,汇编代码的流程是最准确的。
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关链接