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