【发布时间】:2010-12-20 03:55:57
【问题描述】:
看来我需要在使用 C# 的 switch 语句中的每个 case 块中使用一个中断。
我可以在其他语言中看到这种情况的原因,您可以通过下一个 case 语句。
案例块是否有可能落入其他案例块?
非常感谢,非常感谢!
【问题讨论】:
标签: c# switch-statement break
看来我需要在使用 C# 的 switch 语句中的每个 case 块中使用一个中断。
我可以在其他语言中看到这种情况的原因,您可以通过下一个 case 语句。
案例块是否有可能落入其他案例块?
非常感谢,非常感谢!
【问题讨论】:
标签: c# switch-statement break
在我的 C#(.NET 1.1,CF)代码中,这两个都是允许的:
switch (_printerChoice)
{
case BeltPrintersEnum.ZebraQL220:
return new ZebraQL220Printer();
break;
case BeltPrintersEnum.ONeal:
return new ONealPrinter();
break;
default:
return new ZebraQL220Printer();
break;
}
switch (_printerChoice)
{
case BeltPrintersEnum.ZebraQL220:
return new ZebraQL220Printer();
case BeltPrintersEnum.ONeal:
return new ONealPrinter();
default:
return new ZebraQL220Printer();
}
...但是随着闯入,它们会变灰,因此被认为没有实际意义。因此,至少在我的情况下,它们是允许的,但不是必需的。
【讨论】:
是的,您可以通过两种方式进入下一个案例块。您可以使用不需要休息的空案例,也可以使用goto 跳转到下一个(或任何)案例:
switch (n) {
case 1:
case 2:
case 3:
Console.WriteLine("1, 2 or 3");
goto case 4;
case 4:
Console.WriteLine(4);
break;
}
【讨论】:
case 1 不反对这一点。请参阅 Eric Lippert's Explanation 以及我的评论,其中提到了为什么区分不是迂腐的。告诉人们空箱子是合法的causes them to make mistakes.
执行“break”是为了阻止错误。如果您需要强制失败,请使用“goto case”(用适当的值替换)
下面的例子展示了你可以做什么:
switch(n)
{
case 1:
case 2:
//do something for 1+2
//...
goto case 3;
case 3:
//do something for 3, and also extra for 1+2
//...
break;
default:
//do something for all other values
//...
break;
}
见http://msdn.microsoft.com/en-us/library/06tc147t%28VS.80%29.aspx
【讨论】:
break; 的编译时强制执行并不能防止您意外掉线,因为正如您所说,甚至不支持掉线,因此不会发生此类事故......
C# 不支持隐式遍历构造,但break(或goto)仍然必须存在(msdn)。您唯一能做的就是以下列方式堆叠案例:
switch(something) {
case 1:
case 2:
//do something
break;
case 3:
//do something else
}
但是break(或另一个跳转语句,如goto)只需要在那里。
【讨论】: