5

我收到以下 FxCop 错误:

CA1820:Microsoft.Performance:将“Program.Main()”中对“string.operator ==(string, string)”的调用替换为对“String.IsNullOrEmpty”的调用。

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

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

        Console.ReadLine();
    }
4

4 回答 4

4

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

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

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

现在它正在抱怨a == "",这里是它抱怨它的描述:

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

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

于 2013-01-30T07:29:25.570 回答
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;
    }
}
于 2013-01-30T07:22:54.877 回答
0

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

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

string str = "abc";
if (string.IsNullOrEmpty(str))
    Console.WriteLine("Hello");
于 2013-01-30T07:26:32.247 回答
-1

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

于 2013-01-30T07:23:50.993 回答