다음을 통해 공유


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

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

원인

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

규칙 설명

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

탐지

암시적 변환:

  • Span<SomeT> slice = arr[a..b];
  • Memory<SomeT> slice = arr[a..b];

탐지하지 않음

명시적 변환:

  • Span<SomeT> slice = (Span<SomeT>)arr[a..b];
  • Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];

위반 문제를 해결하는 방법

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

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs for both statements below
        Span<byte> tmp2 = arr[0..5];
        Memory<byte> tmp4 = arr[5..10];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violations fixed with AsSpan or AsMemory accordingly
        Span<byte> tmp2 = arr.AsSpan()[0..5];
        Memory<byte> tmp4 = arr.AsMemory()[5..10];
        ...
    }
}

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

CA1833에 대한 코드 수정 사항 - 배열의 Span 또는 Memory 부분을 가져오려면 범위 기반 인덱서 대신 AsSpan 또는 AsMemory 사용

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

class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation occurs
        Span<byte> tmp1 = arr[0..5];
        Memory<byte> tmp2 = arr[5..10];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation fixed with explicit casting
        Span<byte> tmp1 = (Span<byte>)arr[0..5];
        Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
        ...
    }
}

경고를 표시하지 않는 경우

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

경고 표시 안 함

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

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

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

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

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

참고 항목