CA1820: 文字列の長さを使用して空の文字列をテストします

TypeName

TestForEmptyStringsUsingStringLength

CheckId

CA1820

分類

Microsoft.Performance

互換性に影響する変更点

なし

原因

文字列が、Object.Equals を使用して空の文字列と比較されています。

規則の説明

String.Length プロパティまたは String.IsNullOrEmpty メソッドを使用して文字列を比較する方法は、Equals を使用する場合よりもはるかに高速です。 この理由として、Equals の方が、IsNullOrEmpty または Length プロパティ値を取得するときに実行される命令数よりも多くの MSIL 命令を実行されることと、ゼロと比較されることが挙げられます。

null 文字列の場合、EqualsLength == 0 の動作は異なることに注意してください。 null 文字列について Length プロパティの値を取得しようとすると、共通言語ランタイムによって System.NullReferenceException がスローされます。 null 文字列と空の文字列を比較すると、共通言語ランタイムによって例外はスローされません。この比較では false が返ります。 null のテストは、これらの 2 つの手法の相対的なパフォーマンスに大きな影響を与えません。 .NET Framework 2.0 が対象の場合、IsNullOrEmpty メソッドを使用します。 それ以外の場合、できれば Length == の比較を使用します。

違反の修正方法

この規則違反を修正するには、比較に Length プロパティを使用するように変更し、null 文字列をテストします。 .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.");
         }
      }
   }
}