如何解决CA1820 for switch语句

时间:2013-01-30 07:19:18

标签: c# .net

我正在跟踪FxCop错误:

  

CA1820:Microsoft.Performance:通过调用'String.IsNullOrEmpty'替换'Program.Main()'中对'string.operator ==(string,string)'的调用。

 static void Main()
    {
        string str = "abc";

        switch (str)
        {
            case "":
                Console.WriteLine("Hello");
                break;
        }

        Console.ReadLine();
    }

4 个答案:

答案 0 :(得分:4)

这个有趣的问题。如果你在ILSpy中查看它,你会看到反编译的代码为:

string str = "abc";
string a;
if ((a = str) != null && a == "")
{
    Console.WriteLine("Hello");
}
Console.ReadLine();

它转换为if-else块的原因是,如果switch语句包含5或更少5 case子句,那么它将被视为{{1否则将使用查找表。(我不确定数字if - else但这是ILSpy中显示的内容)

现在它抱怨5,这里是为什么抱怨它的描述:

CA1820: Test for empty strings using string length

  

使用String.Length属性比较字符串   String.IsNullOrEmpty方法明显快于使用   等于即可。这是因为Equals执行的MSIL明显更多   指令比IsNullOrEmpty或指令数量多   执行以检索Length属性值并将其与零进行比较。   您应该知道Equals和Length == 0的行为有所不同   空字符串。如果您尝试获取Length属性的值   null字符串,公共语言运行库抛出一个   System.NullReferenceException。如果你执行a之间的比较   null字符串和空字符串,公共语言运行库没有   抛出异常;比较返回false。测试null   不会显着影响这两者的相对表现   方法。在以.NET Framework 2.0为目标时,请使用IsNullOrEmpty   方法。否则,尽可能使用长度==比较。

答案 1 :(得分:1)

此规则强制使用字符串的Length属性或string.IsNullOrEmpty来检查空字符串,而不是使用等于运算符(str == "")进行检查。

 string str = "abc";

        switch (str.Length)
        {
            case 0:
                Console.WriteLine("Hello");
                break;
        }

        Console.ReadLine();

但我建议您在switch语句之前检查带有IsNullOrEmpty的字符串,或将string.Empty个案移到default个案中。

if (string.IsNullOrEmpty(str))
{
    // related code section
}
else
{
    switch (str)
    {
        case "case1":
            Console.WriteLine("Hello");
            break;
        case "case2":
            Console.WriteLine("case2");
            break;
    }
}

答案 2 :(得分:0)

您不应该在switch语句中执行此操作。这是一个糟糕的编程习惯。

你应该使用简单的if条件。

string str = "abc";
if (string.IsNullOrEmpty(str))
    Console.WriteLine("Hello");

答案 3 :(得分:-1)

您应该使用string.empty而不是“”但这可能无法解析fxcop警告。这通常我会注意,但在这种情况下似乎过于活跃,假设你真的想要带有字符串的开关/案例的模式。如果由于某种原因你无法抑制它(假设真正的switch语句有更多的情况),你可以在case的前面写一个特殊的if(String.IsNullOrEmpty(str))....