C#.NET中的GOTO语句

时间:2009-12-23 11:43:07

标签: c# goto

try
{...
block:
....
}
catch{ ..}
GOTO block
...
....
finally{...}

在这种情况下goto会执行吗?

2 个答案:

答案 0 :(得分:14)

由于'GOTO block'而不是'goto block;',它将无法编译,即使它是正确的,它也不会编译,因为C#规范声明(§8.9.3):

  

goto 标识符语句的目标是带有给定标签的带标签的语句。如果当前函数成员中不存在具有给定名称的标签,或者如果goto语句不在标签的范围内,则会发生编译时错误。此规则允许使用goto语句将控制权移出嵌套作用域,但不能转移到嵌套作用域中。

我也发现了几个有趣的规格:

  

goto语句无法退出finally块(第8.10节)。当goto语句在finally块内发生时,goto语句的目标必须在同一个finally块内,否则会发生编译时错误。

  

goto语句执行如下:

     
      
  • 如果goto语句退出一个或多个具有关联的finally块的try块,则>控制最初被转移到最里面的try语句的finally块。当>并且如果控制到达finally块的结束点,则控制转移到下一个封闭的try语句的> finally块。重复该过程,直到执行了所有介入的try语句的> finally块为止。
  •   
  • 控制转移到goto语句的目标。
  •   

后者意味着如果你有

try
{
    ...
    goto Label1;
}
finally
{
    CloseAll();
}

Label1:
   MethodB();

在实际将控件转移到CloseAll()并执行Label1之前,它会调用MethodB()

很有道理,但我从没想过......

答案 1 :(得分:6)

没有。 block:标签必须在try之外,以便goto看到它。代码甚至不会编译。你参加考试了吗?)?