C# 部分切换vs if语句中的默认情况为空

C# 部分切换vs if语句中的默认情况为空,c#,sonarqube,sharpdevelop,C#,Sonarqube,Sharpdevelop,假设您有一个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

假设您有一个
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;
}
if (type == Type.A) // Do something
else if (type == Type.B) // Do something
else if (type == Type.C) // Do something
这可以很好地编译和工作,但是Sonarqube 5.2(使用C#的默认规则)检查代码并抱怨
开关
没有默认大小写(它将其视为一个主要问题)。因此,将代码更改为:

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
语句:

switch (type)
{
    case Type.A: // Do something
        break;
    case Type.B: // Do something
        break;
    case Type.C: // Do something
        break;
}
if (type == Type.A) // Do something
else if (type == Type.B) // Do something
else if (type == Type.C) // Do something
使用此代码,SonarQube和SharpDevelop都不会抱怨。好的,SharpDevelop建议将
if
转换成
开关


那么,哪种方式更好呢?我是否应该将默认情况添加到
开关
并忽略它?我是否应该忽略SonarQube中的问题?或者我应该直接使用
if
句子吗?还有其他更合适的方法吗?

好吧,我认为你应该总是有一个默认案例。我在默认情况下抛出了一个异常,因为它表明有一些我忘记编码的东西(例如,通常是一个增加的枚举值),并使错误所在的位置清晰可见


当然,您所做的取决于默认情况在应用程序中的含义。是否真的存在这样一种状态,即“什么都不做”是通过代码的正确路径?这通常表示缺陷或脆弱的代码会导致重构。同样的情况也适用于
if
块而不使用
else
,您建议将其作为一种解决方法。事实上,我很惊讶sonarqube也没有对此抱怨。

好吧,在我看来,你应该总是有一个默认案例。我在默认情况下抛出了一个异常,因为它表明有一些我忘记编码的东西(例如,通常是一个增加的枚举值),并使错误所在的位置清晰可见


当然,您所做的取决于默认情况在应用程序中的含义。是否真的存在这样一种状态,即“什么都不做”是通过代码的正确路径?这通常表示缺陷或脆弱的代码会导致重构。同样的情况也适用于
if
块而不使用
else
,您建议将其作为一种解决方法。事实上,我很惊讶sonarqube也没有抱怨这一点。

说真的,你不应该为相互冲突的VS提供多个扩展。我建议将它们全部删除,只需安装resharper;)。。。在没有默认设置的情况下使用开关。也要动动脑筋@M.kazemAkhgary我用的不是Visual Studio,而是SharpDevelop。SonarQube是我们持续集成环境的一部分,我们不会将其作为插件使用。对不起。我不知道这件事。但你的问题是基于意见的。@M.kazemAkhgary让我翻译一下。SharpDevelop建议类似于Resharper,SonarQube类似于代码分析。对于default案例,您应该有如下内容:抛出新的InvalidOperationException(“无效案例:+type”)说真的,你不应该有多个互相冲突的VS扩展。我建议将它们全部删除,只需安装resharper;)。。。在没有默认设置的情况下使用开关。也要动动脑筋@M.kazemAkhgary我用的不是Visual Studio,而是SharpDevelop。SonarQube是我们持续集成环境的一部分,我们不会将其作为插件使用。对不起。我不知道这件事。但你的问题是基于意见的。@M.kazemAkhgary让我翻译一下。SharpDevelop建议类似于Resharper,SonarQube类似于代码分析。对于default案例,您应该有如下内容:抛出新的InvalidOperationException(“无效案例:+type”)我同意。没有
default
抛出异常(或执行一些默认逻辑)可能会产生与“吞咽”异常类似的后果。我想你永远不能说空的默认情况总是不正确的,但我会检查我的代码,看看这是否是我们的情况。也许我们没有抛出一个例外,或者可能是一种气味,就像你说的那样。@CarlosAlejo--我同意,这并不总是错误的,但根据我的经验,这是罕见的…显然sonarqube同意,因此你得到了错误/警告。我同意。没有
default
抛出异常(或执行一些默认逻辑)可能会产生与“吞咽”异常类似的后果。我想你永远不能说空的默认情况总是不正确的,但我会检查我的代码,看看这是否是我们的情况。也许我们没有抛出一个异常,或者可能是一种气味,就像你说的那样。@CarlosAlejo--我同意,这并不总是不正确的,但根据我的经验,这是罕见的……显然sonarqube同意,因此你得到了错误/警告。