【发布时间】:2017-10-26 16:46:50
【问题描述】:
我正在使用遗留的 C# 代码,并且看到了两种样式的 switch 语句。我来自 Python 背景,所以这两个 switch 使用之间的细微差别让我无法理解
示例 #1
public string SwitchExample1(int value)
{
switch(value)
{
case 1: return "a";
case 2: return "b";
default: return "c";
}
}
示例 #2
public string SwitchExample2(int value)
{
switch(value)
{
case 1: return "a";
case 2: return "b";
}
return "c";
}
在功能上它们是相同的——当value != 1 && value != 2 时它们都返回“c”
这仅仅是风格上的差异吗?或者是否有最佳实践要求您使用其中一种?
【问题讨论】:
-
这是一个编程风格问题。良好的编程实践需要从代码的最后一条语句返回的方法。第一种情况没有遵循良好的编程实践。
-
静态代码分析器通常会在第二种情况下警告您忘记添加
default情况(您至少可以执行throw NotSupportedException()之类的操作)。仅此一项就足以使其成为陈述的一部分,就像它在逻辑上一样。 (当您考虑到典型用例是枚举时,这更有意义,其中值列表显然不是开放式的,但实际上实践是因为值不限于定义的标签,因此忘记检查无效值是一个常见错误。) -
根据情况,我也希望
default抛出异常。否则,您的default将默默地接受编写switch时未预料到的未来值。我如何确定我今天编写的处理程序对于我没有预料到的未来价值是正确的?抛出异常迫使我解决它。 -
@jdweng 第一个示例的最后一条语句是
switch语句! 它里面的东西是它 body 的一部分,又名 block,又名,compound statement。 --- 我不知道您在哪里找到了“良好编程实践” 指南,该指南告诉您将 明显的默认行为 移出default案例,只是为了把它作为一个单独的(最后一个)声明,但我可以告诉你三件事:恕我直言,1)指南做错了,2)你学错了,最糟糕的是,3)你在传播错误。 ?????? -
返回是从方法返回而不是从switch语句中返回。在这种情况下,默认是什么都不做,不要在默认中放任何东西。这与返回无关。建议将return语句放在代码的最后一行。
标签: c# switch-statement