다음을 통해 공유


CA1820: 문자열 길이를 사용하여 문자열이 비었는지 테스트하십시오.

TypeName

TestForEmptyStringsUsingStringLength

CheckId

CA1820

범주

Microsoft.Performance

변경 수준

주요 변경 아님

원인

Object.Equals를 사용하여 문자열을 빈 문자열과 비교했습니다.

규칙 설명

String.Length 속성 또는 String.IsNullOrEmpty 메서드를 사용하여 문자열을 비교하면 Equals를 사용할 때보다 훨씬 빠릅니다. 이것은 EqualsLength 속성 값을 검색하여 이를 0과 비교하는 명령의 개수나 IsNullOrEmpty보다 훨씬 많은 MSIL 명령을 실행하기 때문입니다.

EqualsLength == 0은 null 문자열에 대해 서로 다르게 동작합니다. null 문자열에 대해 Length 속성 값을 가져오려고 하면 공용 언어 런타임에서 System.NullReferenceException을 throw합니다. null 문자열과 빈 문자열을 비교하면 공용 언어 런타임에서는 예외를 throw하지 않으며 false가 반환됩니다. null 테스트의 경우에는 두 방법의 상대적인 성능에 큰 차이가 없습니다. .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.");
         }
      }
   }
}