Share via


CA1832: 배열의 ReadOnlySpan 또는 ReadOnlyMemory 부분을 가져오기 위해 범위 기반 인덱서 대신 AsSpan 또는 AsMemory를 사용합니다.

속성
규칙 ID CA1832
타이틀 배열의 ReadOnlySpan 또는 ReadOnlyMemory 부분을 가져오려면 범위 기반 인덱서 대신 AsSpan 또는 AsMemory를 사용하세요.
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

배열에서 범위 인덱서를 사용하고 값을 ReadOnlySpan<T> 또는 ReadOnlyMemory<T>에 암시적으로 할당하는 경우입니다.

규칙 설명

a Span<T> 의 범위 인덱서는 복사되지 않는 Slice 작업입니다. 그러나 배열의 범위 인덱서의 경우 메서드가 대신 Slice사용되며, 이 메서드 GetSubArray 는 배열의 요청된 부분의 복사본을 생성합니다. 일반적으로 이 복사본은 ReadOnlySpan<T> 또는 ReadOnlyMemory<T> 값으로 암시적으로 사용되는 경우 필요하지 않습니다. 복사본이 필요하지 않은 경우 AsSpan 또는 AsMemory 메서드를 사용하여 불필요한 복사를 방지합니다. 복사본이 필요한 경우 먼저 지역 변수에 할당하거나 명시적 캐스트를 추가합니다.

분석기는 범위 인덱서 작업의 결과에 암시적 캐스트가 사용되는 경우에만 보고합니다.

탐지

암시적 변환:

  • ReadOnlySpan<SomeT> slice = arr[a..b];
  • ReadOnlyMemory<SomeT> slice = arr[a..b];

탐지하지 않음

명시적 변환:

  • ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
  • ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 불필요한 데이터 복사본을 AsSpan 만들지 않도록 확장 메서드를 AsMemory 사용합니다.

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs for both statements below
        ReadOnlySpan<byte> tmp1 = arr[0..2];
        ReadOnlyMemory<byte> tmp3 = arr[5..8];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violations fixed with AsSpan or AsMemory accordingly
        ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
        ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
        ...
    }
}

Visual Studio에서는 이 규칙에 대한 코드 수정 사항을 사용할 수 있습니다. 이를 사용하려면 위반에 커서를 놓고 Ctrl+ 키를 누릅니다.(마침표). 표시되는 옵션 목록에서 배열의 범위 기반 인덱서 대신 AsSpan 사용을 선택합니다.

Code fix for CA1832 - Use AsSpan or AsMemory instead of Range-based indexers for getting ReadOnlySpan or ReadOnlyMemory portion of an array

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

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs
        ReadOnlySpan<byte> tmp1 = arr[0..2];
        ReadOnlyMemory<byte> tmp3 = arr[5..8];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation fixed with explicit casting
        ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
        ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
        ...
    }
}

경고를 표시하지 않는 경우

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

경고 표시 안 함

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

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

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

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

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

참고 항목