部分切换与句子中的空默认情况

Cha*_*lie 0 c# sharpdevelop sonarqube

假设你有这样的enum类型:

public enum Type
{
    A, B, C, D, E, F
}
Run Code Online (Sandbox Code Playgroud)

然后你想根据一些值做一些事情,所以你创建一个切换句子:

switch (type)
{
    case Type.A: // Do something
        break;
    case Type.B: // Do something
        break;
    case Type.C: // Do something
        break;
}
Run Code Online (Sandbox Code Playgroud)

这编译并且工作正常,但随后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;
}
Run Code Online (Sandbox Code Playgroud)

但是接下来是SharpDevelop抱怨,默认情况并告诉你代码不应该存在,因为它什么都不做.

所以你最终将代码更改为一个if句子:

if (type == Type.A) // Do something
else if (type == Type.B) // Do something
else if (type == Type.C) // Do something
Run Code Online (Sandbox Code Playgroud)

有了这段代码,SonarQube和SharpDevelop都没有抱怨.好吧,SharpDevelop善意地建议if可以转换为switch.

那么,哪种方式更好?我应该将默认情况添加到switch并忽略SharpDevelop吗?我应该忽略SonarQube中的问题吗?或者我应该去if判刑?有没有其他方法可以更恰当地做到这一点?

ror*_*.ap 5

那么,在我看来,你应该总是有一个默认情况.我在默认情况下抛出一个异常,因为它表明我忘记了编码(例如,通常是一个添加的枚举值),并且明确显示错误的位置.

当然,您所做的取决于默认情况在您的应用程序中的含义.真的是一个"无所事事"是通过代码的好路径的状态吗?这通常表示应该导致重构的缺陷或脆弱代码.对于if没有else你提出的解决方案的块也是如此.事实上,我很惊讶sonarqube也没有抱怨这一点.