我得到了以下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)
嗯,有趣的问题。如果你在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 5
case 子句,那么它将被视为if - else
否则将使用查找表。(我不确定数字,5
但这就是中显示的内容ILSpy)
现在它正在抱怨a == ""
,以下是它抱怨的原因的描述:
使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串比使用 Equals 快得多。这是因为 Equals 执行的 MSIL 指令明显多于 IsNullOrEmpty 或检索 Length 属性值并将其与零进行比较所执行的指令数。您应该知道 Equals 和 Length == 0 对于空字符串的行为有所不同。如果尝试获取空字符串的 Length 属性的值,公共语言运行时将引发 System.NullReferenceException。如果在空字符串和空字符串之间执行比较,公共语言运行时不会引发异常;比较返回 false。测试 null 不会显着影响这两种方法的相对性能。当面向 .NET Framework 2.0 时,请使用 IsNullOrEmpty 方法。否则,请尽可能使用 Length == 比较。
归档时间: |
|
查看次数: |
998 次 |
最近记录: |