Share via


CA1831: 적절한 경우 문자열에 범위 기반 인덱서 대신 AsSpan 사용

속성
규칙 ID CA1831
타이틀 적절한 경우 문자열에 대해 범위 기반 인덱서 대신 AsSpan을 사용하세요.
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 경고로

원인

범위 인덱서가 문자열에서 사용되고 값이 ReadOnlySpan<char>에 암시적으로 할당됩니다.

규칙 설명

이 규칙은 문자열에서 범위 인덱서를 사용하고 범위 형식에 할당할 때 발생합니다. Span<T>의 범위 인덱서는 복사하지 않는 Slice 작업이지만 문자열의 범위 인덱서에서는 Substring 메서드가 Slice 대신 사용됩니다. 따라서 문자열에서 요청한 부분의 복사본이 생성됩니다. 일반적으로 이 복사본은 ReadOnlySpan<T> 또는 ReadOnlyMemory<T> 값으로 암시적으로 사용되는 경우 필요하지 않습니다. 복사본이 필요하지 않은 경우 AsSpan 메서드를 사용하여 불필요한 복사를 방지합니다. 복사본이 필요한 경우 먼저 지역 변수에 할당하거나 명시적 캐스트를 추가합니다. 분석기는 범위 인덱서 작업의 결과에 암시적 캐스트가 사용되는 경우에만 보고합니다.

탐지

암시적 변환:

ReadOnlySpan<char> slice = str[a..b];

탐지하지 않음

명시적 변환:

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 문자열에서 Range 기반 인덱서 대신 AsSpan을 사용하여 불필요한 데이터 복사본이 생성되지 않도록 합니다.

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

Visual Studio에서는 이 규칙에 대한 코드 수정 사항을 사용할 수 있습니다. 이를 사용하려면 위반에 커서를 놓고 Ctrl+ 키를 누릅니다.(마침표). 옵션 목록이 표시되면 Use AsSpan instead of the Range-based indexer on a string(문자열에서 범위 기반 인덱서 대신 AsSpan 사용)을 선택합니다.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

이 경고를 방지하기 위해 명시적 캐스트를 추가할 수도 있습니다.

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

경고를 표시하지 않는 경우

복사본을 만들어야 하는 경우 이 규칙의 위반을 표시하지 않아도 됩니다.

경고 표시 안 함

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

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

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

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

이 전체 규칙 범주를 사용하지 않도록 설정하려면 구성 파일에서 범주의 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

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

참고 항목