部分开关与 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" 是通过代码的正确路径的状态?这通常表示应该导致重构的缺陷或脆弱代码。对于没有 else
的 if
块也是如此,您建议将其作为解决方法。事实上,我很惊讶 sonarqube 也没有抱怨这个。
假设您有这样一个 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" 是通过代码的正确路径的状态?这通常表示应该导致重构的缺陷或脆弱代码。对于没有 else
的 if
块也是如此,您建议将其作为解决方法。事实上,我很惊讶 sonarqube 也没有抱怨这个。