【问题标题】:C# - goto inside a switch statement hangsC# - switch 语句中的 goto 挂起
【发布时间】:2015-07-16 14:01:47
【问题描述】:

我在 switch 语句中使用 goto 来模拟跌倒行为。

我的 switch 语句使用enum 来确定使用哪种情况。 当包含goto 的case 被执行时,执行会在此时挂起,并且宿主进程开始使用更多的cpu。

我的代码如下所示:

switch (myEnum)
{
    case HostClass.EnumType.var1: goto case HostClass.EnumType.var2;
    case HostClass.EnumType.var2: myint = 3; break;
    default: break;
}

为什么我的 switch 语句挂在 goto 上?在线阅读,这似乎是一种常见的模式。

删除 goto 修复它,但我不明白为什么。

【问题讨论】:

  • 它没有挂在 goto 上,无法重现!
  • 我对这个问题的投票和答案的数量感到惊讶,上面的代码在goto 声明上没有挂起,这个问题是不可重现的。跨度>
  • 您可能有错字,以至于goto 回到了与您已经使用的相同的case 标签,或者您做了几个构成“循环”的goto 语句最终又回来了到同一个标签。但是,您的示例代码不会重现该问题。请更加注意包含实际重现您遇到的问题的代码。否则人们只能猜测(他们会!)关于问题是什么。
  • 正如@Habib 所说的不可重现:dotnetfiddle.net/yyVJRw
  • 原来我有一个错字导致它循环(根据@JeppeStigNielsen 评论)。但我真的在寻找一种失败的方法(根据接受的答案)

标签: c# c#-4.0


【解决方案1】:

您不需要goto。只需这样做:

switch (myEnum)
{
    case HostClass.EnumType.var1:
    case HostClass.EnumType.var2: 
        myint = 3; break;
    default: break;
}

更新

好的,所以(我相信)它不起作用的原因是你需要一个 place 到goto。例如:

for(var i = 0; i < 100; i+=1)
{
    if(i == 50)
    {
        goto Outer;
    }
}

Outer:
Console.WriteLine("Done");

这是一个非常做作的例子。

我认为这不能解释为什么您的代码会挂起。我唯一能想到的是goto正在等待地址?

正如 NeilP 在 cmets 中所提到的,您只能通过空的案例陈述。这仍然不能解释为什么您的代码会挂在“goto”上。不应该。

【讨论】:

  • “删除 goto 可以解决问题,但我不明白为什么。”
  • 好的,所以不允许在第一个 case 上添加分号,因为“控制不能从一个 case label ('case 1:') 中落空”但是没有分号它可以工作。我现在明白了!
  • @NeilP 你只能通过空的案例陈述。这仍然不能解释为什么您的代码会挂在“goto”上。不应该。
  • @simonlchilds 您能否在回答中包含 Neil P 的评论?这似乎为他解决了问题。
  • 您的更新无关紧要。您可以goto 一个案例标签。 goto 的一个常见用途是将控制转移到特定的 switch-case 标签或 switch 语句中的默认标签。 - MS
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多