다음을 통해 공유


CA1870: 캐시된 'SearchValues' 인스턴스 사용

속성
규칙 ID CA1870
타이틀 캐시된 'SearchValues' 인스턴스 사용
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

IndexOfAny 또는 ContainsAny 메서드는 대신 사용할 SearchValues 수 있는 방식으로 많은 상수 값으로 호출됩니다.

규칙은 이미 최적의 구현을 사용하므로 최대 5개의 값을 사용하는 호출에 플래그를 지정하지 않습니다.

규칙 설명

캐시된 SearchValues<T> 인스턴스를 사용하는 것이 값을 직접 전달하거나 IndexOfAnyContainsAny 전달하는 것보다 더 효율적입니다.

위반 문제를 해결하는 방법

필드에서 인스턴스를 SearchValues<T> 만들고 캐시한 static readonly 다음, 해당 인스턴스를 IndexOfAny 전달하거나 ContainsAny 대신 호출합니다.

이 변환을 수행하는 코드 수정기를 사용할 수 있습니다.

예시

다음 코드 조각은 CA1870의 두 가지 위반을 보여 줍니다.

static readonly char[] MyValues = new[] { 'a', 'b', 'c', 'x', 'y', 'z' };

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(MyValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept("abcxyz");
}

다음 코드 조각은 위반을 해결합니다.

private static readonly SearchValues<char> s_myValues = SearchValues.Create("abcxyz");

static int IndexOfMyValues(ReadOnlySpan<char> text)
{
    return text.IndexOfAny(s_myValues);
}

static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
    return !text.ContainsAnyExcept(s_myValues);
}

동일한 값 s_myValues 집합을 사용하여 IndexOfAny 여러 번의 호출이 있는 경우 다시 사용해야 합니다.

경고를 표시하지 않는 경우

성능이 중요하지 않은 경우 이 경고를 표시하지 않는 것이 안전합니다.

경고 표시 안 함

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

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

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

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

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