CA1820:使用字符串长度测试是否有空字符串
类型名 |
TestForEmptyStringsUsingStringLength |
CheckId |
CA1820 |
类别 |
Microsoft.Performance |
是否重大更改 |
非重大更改 |
原因
将字符串与空字符串比较时使用的是 Object.Equals。
规则说明
使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。 这是因为与 IsNullOrEmpty 或者为检索 Length 属性值并将其与零比较所需执行的指令数相比,Equals 执行更多的 MSIL 指令。
您应该注意,Equals 和 Length == 0 对于空字符串的行为表现不同。 如果您尝试获取空字符串的 Length 属性的值,公共语言运行时将引发 System.NullReferenceException。 如果比较空 (null) 字符串和空 (empty) 字符串,则公共语言运行时不会引发异常;比较将返回 false。 对空字符串进行测试不会显著影响这两种方法的相对性能。 当目标为 .NET Framework 2.0 时,使用 IsNullOrEmpty 方法。 否则,在可能的情况下请使用 Length == 比较。
如何解决冲突
要修复与该规则的冲突,请将比较方法更改为使用 Length 属性测试空字符串。 如果目标为 .NET Framework 2.0,则使用 IsNullOrEmpty 方法。
何时禁止显示警告
如果不用考虑性能问题,则可以安全地禁止显示此规则发出的警告。
示例
下面的示例演示用于查找空字符串的不同技术。
using System;
namespace PerformanceLibrary
{
public class StringTester
{
string s1 = "test";
public void EqualsTest()
{
// Violates rule: TestForEmptyStringsUsingStringLength.
if (s1 == "")
{
Console.WriteLine("s1 equals empty string.");
}
}
// Use for .NET Framework 1.0 and 1.1.
public void LengthTest()
{
// Satisfies rule: TestForEmptyStringsUsingStringLength.
if (s1 != null && s1.Length == 0)
{
Console.WriteLine("s1.Length == 0.");
}
}
// Use for .NET Framework 2.0.
public void NullOrEmptyTest()
{
// Satisfies rule: TestForEmptyStringsUsingStringLength.
if ( !String.IsNullOrEmpty(s1) )
{
Console.WriteLine("s1 != null and s1.Length != 0.");
}
}
}
}