我正在跟踪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();
}
答案 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))....