假设你有enum
这样的类型:
public enum Type
{
A, B, C, D, E, F
}
然后你想根据一些值做一些事情,所以你创建一个切换句子:
switch (type)
{
case Type.A: // Do something
break;
case Type.B: // Do something
break;
case Type.C: // Do something
break;
}
这编译并正常工作,但随后Sonarqube 5.2(使用C#的默认规则)检查代码并抱怨switch
没有默认情况(它将其视为主要问题)。所以你将代码更改为:
switch (type)
{
case Type.A: // Do something
break;
case Type.B: // Do something
break;
case Type.C: // Do something
break;
default: // Do nothing
break;
}
但是接下来是SharpDevelop抱怨,默认情况并告诉你代码不应该存在,因为它什么都不做。
因此,您最终将代码更改为if
句子:
if (type == Type.A) // Do something
else if (type == Type.B) // Do something
else if (type == Type.C) // Do something
使用此代码,SonarQube和SharpDevelop都没有抱怨。好吧,SharpDevelop建议将if
转换为switch
。
那么,哪种方式更好?我应该将默认案例添加到switch
并忽略SharpDevelop吗?我应该忽略SonarQube中的问题吗?或者我应该去if
句子?还有其他方法可以做得更好吗?
答案 0 :(得分:5)
嗯,我认为你应该总是有一个默认案例。我在默认情况下抛出一个异常,因为它表明我忘记了编码(例如,通常是一个添加的枚举值),并且明确显示错误的位置。
当然,您所做的取决于默认情况在您的应用程序中的含义。真的是一个“无所事事”是通过代码的好路径的状态吗?这通常表示应该导致重构的缺陷或脆弱代码。对于没有if
的{{1}}块,您提出的解决办法也是如此。事实上,我很惊讶,sonarqube也没有抱怨这一点。