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

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

4

2 回答 2

15

它不会因为 ' 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 块。当 >and 如果控制到达 finally 块的终点,控制将转移到下一个封闭 try 语句的 >finally 块。重复此过程,直到所有介入的 try 语句的 >finally 块都已执行。
  • 控制转移到 goto 语句的目标。

后者意味着如果你有

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

Label1:
   MethodB();

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

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

于 2009-12-23T11:58:30.237 回答
6

编号块:标签必须在尝试之外才能让 goto 看到它。代码甚至不会编译。你在参加考试吗:)?

于 2009-12-23T11:47:19.447 回答