部分开关与 if 语句中的空默认情况

Empty default case in partial switch vs if sentence

假设您有这样一个 enum 类型:

public enum Type
{
    A, B, C, D, E, F
}

然后你想根据某些值做一些事情,所以你创建了一个 switch 语句:

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 句子?有没有其他方法更合适?

好吧,我认为您应该始终有一个默认案例。我在默认情况下抛出一个异常,因为它表明我忘记了一些代码(例如,通常是一个添加的枚举值)并且清楚地表明错误在哪里。

当然,您要做什么取决于默认情况在您的应用程序中意味着什么。是否真的存在 "do nothing" 是通过代码的正确路径的状态?这通常表示应该导致重构的缺陷或脆弱代码。对于没有 elseif 块也是如此,您建议将其作为解决方法。事实上,我很惊讶 sonarqube 也没有抱怨这个。