C# 开关箱中的哥特恐惧症
我有下一个代码:C# 开关箱中的哥特恐惧症,c#,goto,C#,Goto,我有下一个代码: switch (curState.ToString()) { case "Processed": ... *(couple code lines)* break; case "NotPresent": if (someValue == null) { goto case "Undefined"; } goto case "Pro
switch (curState.ToString())
{
case "Processed":
... *(couple code lines)*
break;
case "NotPresent":
if (someValue == null)
{
goto case "Undefined";
}
goto case "Processed";
case "Undefined":
break;
}
有人告诉我,最好为“NotPresent”case定义方法并调用它,而不是
goto case“Processed”
。这是哥特恐惧症还是合理的?我喜欢我的变体。任何答案都是猜测和意见。但我相信人们普遍认为(在互联网上的几个地方都有这样的说法)goto
的两个可接受的用法是:
当然,您的代码是有效的,并且您知道
goto
的负面含义。所以无论你做什么决定,都将是一个明智的决定。我要说的是,做出决定,在需要之前不要担心。任何答案都是猜测和意见。但我相信人们普遍认为(在互联网上的几个地方都有这样的说法)goto
的两个可接受的用法是:
goto
的负面含义。所以无论你做什么决定,都将是一个明智的决定。我要说的是,做出决定,在需要之前不要担心
我喜欢我的变体
我不喜欢你的变体。当使用GoTo时,GoTo是合适的,它允许您编写比不使用GoTo时更清晰的代码。我认为这一标准在本案中没有得到满足
有人告诉我,最好为“NotPresent”case定义方法并调用它,而不是goto case“Processed”。这是哥特恐惧症还是合理的
您的意思是说,您被告知最好为“Processed”
案例的主体定义一个方法,在该案例中无条件地调用,在“Not Present”
案例中有条件地调用,从而避免一个转到
?我认为这对事情没有多大帮助。只要“Processed”
的case body只包含一些语句,我发现将它们保留在开关的body中就更清晰了
我自己可能会重写你的开关
,如下所示:
switch (curState.ToString())
{
case "NotPresent":
if (someValue != null)
{
goto case "Processed";
}
break;
case "Processed":
... *(couple code lines)*
break;
}
分支到一个什么都不做的案例是没有意义的——而不是一开始就什么都不做——所以我把这个goto
全部删除了。我把“NotPresent”的盒子移到了“Present”的上面,因为这让我想起了一个带有两个盒子标签的开关部分
我还删除了“Undefined”
的空大小写,但如果强调不需要使用curState.ToString()
的其他值很重要,那么我将保留该大小写,并添加一个带有适当断言/抛出/日志的默认大小写
我喜欢我的变体
我不喜欢你的变体。当使用GoTo时,GoTo是合适的,它允许您编写比不使用GoTo时更清晰的代码。我认为这一标准在本案中没有得到满足
有人告诉我,最好为“NotPresent”case定义方法并调用它,而不是goto case“Processed”。这是哥特恐惧症还是合理的
您的意思是说,您被告知最好为“Processed”
案例的主体定义一个方法,在该案例中无条件地调用,在“Not Present”
案例中有条件地调用,从而避免一个转到
?我认为这对事情没有多大帮助。只要“Processed”
的case body只包含一些语句,我发现将它们保留在开关的body中就更清晰了
我自己可能会重写你的开关
,如下所示:
switch (curState.ToString())
{
case "NotPresent":
if (someValue != null)
{
goto case "Processed";
}
break;
case "Processed":
... *(couple code lines)*
break;
}
分支到一个什么都不做的案例是没有意义的——而不是一开始就什么都不做——所以我把这个goto
全部删除了。我把“NotPresent”的盒子移到了“Present”的上面,因为这让我想起了一个带有两个盒子标签的开关部分
我还删除了“Undefined”
的空大小写,但如果需要强调的是,curState.ToString()
不需要其他值,然后,我将保留该案例,并添加一个带有适当断言/抛出/日志记录的默认案例。与其尝试将逻辑强制到开关
语句中,为什么不使用更简单的方法,因为您对未定义的状态不做任何操作:
if ((curState.ToString() == "Processed") ||
((curState.ToString() == "NotPresent") && someValue != null))
{
... *(couple code lines)*
}
与其试图将逻辑强制转换为switch
语句,为什么不使用更简单的方法,因为您对未定义的状态不做任何操作:
if ((curState.ToString() == "Processed") ||
((curState.ToString() == "NotPresent") && someValue != null))
{
... *(couple code lines)*
}
有很多参考资料已经解释了何时以及何时不使用goto
语句。下面是一个很好的例子:如果您不想将细节封装在一个单独的方法中,您可以始终设置布尔标志,并在switch语句之后处理处理。老实说,我认为goto
不应该包含在C#中,它应该被弃用,然后在VB.NET中被淘汰。我对转到的主要问题是它会导致蛙跳。它没有流程。您是否打算让default
案例什么都不做?我知道对这类事情的看法是主观的,但我发现你在这里发布的代码很难阅读。这是你的真实代码吗?还是你的代码比这更复杂?@MatthewWatson甚至没有。我