如何解决CA1820 for switch语句

Atu*_*eka 5 .net c#

我得到了以下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();
    }
Run Code Online (Sandbox Code Playgroud)

Hab*_*bib 4

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

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

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

现在它正在抱怨a == "",以下是它抱怨的原因的描述:

CA1820:使用字符串长度测试空字符串

使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串比使用 Equals 快得多。这是因为 Equals 执行的 MSIL 指令明显多于 IsNullOrEmpty 或检索 Length 属性值并将其与零进行比较所执行的指令数。您应该知道 Equals 和 Length == 0 对于空字符串的行为有所不同。如果尝试获取空字符串的 Length 属性的值,公共语言运行时将引发 System.NullReferenceException。如果在空字符串和空字符串之间执行比较,公共语言运行时不会引发异常;比较返回 false。测试 null 不会显着影响这两种方法的相对性能。当面向 .NET Framework 2.0 时,请使用 IsNullOrEmpty 方法。否则,请尽可能使用 Length == 比较。