다음을 통해 공유


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

속성
규칙 ID CA1820
제목 문자열 길이를 사용하여 빈 문자열을 테스트하세요.
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

문자열이 Object.Equals를 사용하여 빈 문자열과 비교됩니다.

규칙 설명

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

null 문자열인 경우 Equals<string>.Length == 0이 다르게 동작합니다. null 문자열에서 Length 속성의 값을 가져오려고 하면 공용 언어 런타임에서 System.NullReferenceException이 throw됩니다. null 문자열과 빈 문자열을 비교하는 경우 공용 언어 런타임에서 예외가 throw되지 않고 false를 반환합니다. null 테스트는 이러한 두 접근 방식의 상대적 성능에 크게 영향을 주지 않습니다. .NET Framework 2.0 이상을 대상으로 하는 경우 IsNullOrEmpty 메서드를 사용합니다. 그러지 않으면 가능한 경우 Length == 0 비교를 사용합니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 IsNullOrEmpty 메서드를 사용하도록 비교를 변경합니다.

경고를 표시하지 않는 경우

성능이 문제가 되지 않는 경우 이 규칙의 경고를 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA1820
// The code that's violating the rule is on this line.
#pragma warning restore CA1820

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1820.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

예시

다음 예제에서는 빈 문자열을 찾는 데 사용되는 다른 기술을 보여 줍니다.

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.");
        }
    }
}