try
{...
block:
....
}
catch{ ..}
GOTO block
...
....
finally{...}
在这种情况下会执行 goto 吗?
它不会因为 ' 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()
。
很有道理,但我从来没想过...
编号块:标签必须在尝试之外才能让 goto 看到它。代码甚至不会编译。你在参加考试吗:)?