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().
做得很完美,但我从没想过......
| 归档时间: |
|
| 查看次数: |
11066 次 |
| 最近记录: |