Compartilhar via


CA1832: Usar AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz

Property Valor
ID da regra CA1832
Título Usar AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 10 Como sugestão

Causa

Ao usar um indexador de intervalo em uma matriz e atribuir implicitamente o valor a ReadOnlySpan<T> ou ReadOnlyMemory<T>.

Descrição da regra

O indexador de intervalo em um Span<T> é uma operação Slice sem cópia. Mas para o indexador de intervalo em uma matriz, o método GetSubArray será usado em vez de Slice, que produz uma cópia da parte solicitada da matriz. Essa cópia geralmente é desnecessária quando é usada implicitamente como um valor ReadOnlySpan<T> ou ReadOnlyMemory<T>. Se uma cópia não for pretendida, use o método AsSpan ou AsMemory para evitar a cópia desnecessária. Se a cópia for pretendida, atribua-a primeiro a uma variável local ou adicione uma conversão explícita.

O analisador relatará apenas quando uma conversão implícita for utilizada no resultado da operação do indexador de intervalo.

Detecta

Conversões implícitas:

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

Não detecta

Conversões explícitas:

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

Como corrigir violações

Para corrigir uma violação dessa regra, utilize o método de extensão AsSpan ou AsMemory para evitar a criação de cópias de dados desnecessárias.

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];
        ...
    }
}

Dica

Uma correção de código está disponível para essa regra no Visual Studio. Para usá-la, posicione o cursor sobre a violação e pressione Ctrl+. (ponto). Escolha Usar AsSpan em vez do indexador com base na matriz na lista de opções apresentada.

Correção de código para CA1832: usar AsSpan ou AsMemory em vez de indexadores com base em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz

Você também pode evitar esse aviso adicionando uma conversão explícita.

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];
        ...
    }
}

Quando suprimir avisos

É seguro suprimir uma violação dessa regra se a criação de uma cópia é intencional.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Confira também