C#.NET中的GOTO语句

Kir*_*ran 6 c# goto

try
{...
block:
....
}
catch{ ..}
GOTO block
...
....
finally{...}
Run Code Online (Sandbox Code Playgroud)

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

Reg*_*ent 15

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

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

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

goto语句不能退出finally块(第8.10节).当goto语句出现在finally块中时,goto语句的目标必须位于同一个finally块中,否则会发生编译时错误.

和:

goto语句执行如下:

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

后者意味着,如果你有

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

Label1:
   MethodB();
Run Code Online (Sandbox Code Playgroud)

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

做得很完美,但我从没想过......


Mik*_*son 6

编号块:标签必须在try之外,以便goto看到它.代码甚至不会编译.你参加考试:)?

  • 当然,实际尝试Visual Studio中的代码会为您提供大量信息. (2认同)