我见过一份编码规范建议,其中写道:除非在switch语句的穿透中使用goto,否则不要使用它
。
我不理解。到底什么情况下可以使用goto
来作为“例外”呢?
我见过一份编码规范建议,其中写道:除非在switch语句的穿透中使用goto,否则不要使用它
。
我不理解。到底什么情况下可以使用goto
来作为“例外”呢?
在 C# 中,这种结构是非法的:
switch (variable) {
case 2:
Console.WriteLine("variable is >= 2");
case 1:
Console.WriteLine("variable is >= 1");
}
在C++中,如果variable = 2
,它会运行两行代码。这可能是有意为之的,但很容易忘记在第一个case标签结尾处加上break;
。因此,在C#中,他们已将此设置为不合法。要模仿穿透行为,您必须明确地使用goto
来表示您的意图:
switch (variable) {
case 2:
Console.WriteLine("variable is >= 2");
goto case 1;
case 1:
Console.WriteLine("variable is >= 1");
break;
}
话虽如此,有一些情况下使用goto
是解决问题的好方法。不要用"永远不要使用某个东西"的规则来关闭你的思维。如果它完全没有用处,那么它一开始就不会存在于语言中。不使用goto
只是一个指导方针;它不是法律。
C# 不像 C++ 那样默认允许 case 语句穿透(除非该 case 中没有代码)。你必须使用 break
来结束 case 语句。如果需要明确地进行 case 穿透(或跳到其它 case),可以使用 goto case
。由于没有其它方式可实现此行为,大多数(合理的)编码标准都会允许使用此方法。
switch(variable)
{
case 1:
case 2:
// do something for 1 and 2
goto case 3;
case 3:
case 4:
// do something for 1, 2, 3 and 4
break;
}
一个具体的例子(按要求提供):switch(typeOfPathName)
{
case "relative":
pathName = Path.Combine(currentPath, pathName);
goto case "absolute";
case "expand":
pathName = Environment.ExpandEnvironmentVariables(pathName);
goto case "absolute";
case "absolute":
using (var file = new FileStream(pathName))
{ ... }
break;
case "registry":
...
break;
}
public enum ExitAction {
Cancel,
LogAndExit,
Exit
}
这更整洁了。
ExitAction action = ExitAction.LogAndExit;
switch (action) {
case ExitAction.Cancel:
break;
case ExitAction.LogAndExit:
Log("Exiting");
goto case ExitAction.Exit;
case ExitAction.Exit:
Quit();
break;
}
ExitAction action = ExitAction.LogAndExit;
switch (action) {
case ExitAction.Cancel:
break;
case ExitAction.LogAndExit:
Log("Exiting");
Quit();
break;
case ExitAction.Exit:
Quit();
break;
}
goto case
的参数 - 它必须是一个常量。这真是遗憾,因为它会很方便,但这似乎就是它的行为。 - Zooba除了使用goto case
,您还可以跳转到另一个case语句中的标签:goto
switch(i) {
case "0":
// do some stuff
break;
case "1":
// other stuff, then "fall through" to next case clause
goto Case2;
case "2":
Case2:
break;
}
goto case "2";
- Filip Cornelissen这是C#唯一允许 switch case 'fallthrough' 的方法。在C#中(与C、C++或Java不同),switch语句中的一个case块必须以 break
或其他显式跳转语句结尾。
我知道这是一个老话题,但问题仍然存在。我们能否使用下面的代码来代替带有goto语句的丑陋版本?
var variable = 2;
switch (variable)
{
case 2:
Console.WriteLine("variable is >= 2");
goto case 1;
case 1:
Console.WriteLine("variable is >= 1");
break;
}
可能会被更整洁的代码所替代:
if (variable >= 2)
{
Console.WriteLine("variable is >= 2");
}
if (variable >= 1)
{
Console.WriteLine("variable is >= 1");
}
switch
语句中已经有很多goto,但它们的名称不同:每个break
就是一个goto。 - chiccodorocase
实际上是一个label
,而switch
本质上就是一个goto
。每个break
都是一个goto
,但每个continue
也是一个goto
。 - Spook