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

类型名

TestForEmptyStringsUsingStringLength

CheckId

CA1820

类别

Microsoft.Performance

是否重大更改

非重大更改

原因

将字符串与空字符串比较时使用的是 Object.Equals

规则说明

使用 String.Length 属性或 String.IsNullOrEmpty 方法比较字符串要比使用 Equals 的速度快得多。 这是因为与 IsNullOrEmpty 或者为检索 Length 属性值并将其与零比较所需执行的指令数相比,Equals 执行更多的 MSIL 指令。

您应该注意,EqualsLength == 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.");
         }
      }
   }
}