try
{...
block:
....
}
catch{ ..}
GOTO block
...
....
finally{...}
在这种情况下 goto 会执行吗?
它不会编译,因为 'GOTO block
' 代替 'goto block;
' 即使它是正确的,它也不会编译,因为 C# 规范指出(第 8.9.3 节):
的目标是goto
标识符语句是带有给定标签的带标签语句。如果当前函数成员中不存在具有给定名称的标签,或者 goto 语句不在该标签的范围内,则会发生编译时错误。该规则允许使用 goto 语句将控制转移出嵌套范围,但不允许into嵌套范围。
我还发现几个规格对我来说也很有趣:
goto 语句不能退出finally
块(第 8.10 节)。当 goto 语句出现在finally
块中,goto语句的目标必须在同一个块内finally
块,否则会发生编译时错误。
And:
goto 语句执行如下:
- 如果 goto 语句退出一个或多个带有关联的 finally 块的 try 块,则 > 控制首先会转移到最内层 try 语句的 finally 块。当 >and if 控制到达 finally 块的结束点时,控制权将转移到下一个封闭的 try 语句的 >finally 块。重复此过程,直到所有介入的 try 语句的 >finally 块都已执行。
- 控制权转移到 goto 语句的目标。
后者意味着如果你有
try
{
...
goto Label1;
}
finally
{
CloseAll();
}
Label1:
MethodB();
它会打电话CloseAll()
在实际将控制权转移给Label1
并执行MethodB()
.
很有道理,但我从来没有想过......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)