【问题标题】:GOTO statement in C#.NETC#.NET 中的 GOTO 语句
【发布时间】:2009-12-23 11:43:07
【问题描述】:
try
{...
block:
....
}
catch{ ..}
GOTO block
...
....
finally{...}

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

【问题讨论】:

  • 不是编译错误吗?
  • 也许它应该被称为“spaghetti.NET”。 ;-)
  • 为什么投反对票?是的,也许他应该尝试编译它,但仍然......我认为他们不值得
  • @Pondidum 如果这行得通,它可以用来模拟 VB.NET On Error Resume Next。

标签: c# goto


【解决方案1】:

由于 'GOTO block' 而不是 'goto block;' 而无法编译,即使它是正确的也无法编译,因为 C# 规范规定(第 8.9.3 节):

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

我还发现一些对我来说很有趣的规格:

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

还有:

goto 语句执行如下:

  • 如果 goto 语句退出一个或多个带有关联 finally 块的 try 块,>控制最初会转移到最里面的 try 语句的 finally 块。当 >and if 控制到达 finally 块的终点时,控制转移到下一个封闭 try 语句的 >finally 块。重复此过程,直到>所有介入的 try 语句的最后块都已执行。
  • 控制权转移到 goto 语句的目标。

后者意味着如果你有

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

Label1:
   MethodB();

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

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

【讨论】:

  • 在 finally 块中没有出现 goto
  • @Regent 其实我并没有专注于语法。我从你的回答中得到了我想要的谢谢
【解决方案2】:

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

【讨论】:

  • 没有人,实际上我的朋友问我这样的问题,所以我很困惑,所以我想在 Stackoverflow 上提问
  • 我发现在这种情况下阅读 C# 语言规范非常有启发性:)
  • 当然,在 Visual Studio 中实际尝试代码会给你很多信息。
  • @Regent:有启发性 + 有见地 = 有启发性。 :D
  • @erikkallen 我怀疑在这里给出最佳回应的人已经阅读了规范:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多