Partilhar via


CA1832: Use 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 Use AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Como sugestão

Motivo

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 que não copia.Slice 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 é implicitamente usada como um ReadOnlySpan<T> ou ReadOnlyMemory<T> valor. Se uma cópia não for pretendida, use o AsSpan método 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 transmissão explícita.

O analisador só informa quando um molde implícito é usado no resultado da operação do indexador de intervalo.

Deteta

Conversões implícitas:

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

Não deteta

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, use o método ou AsMemory extensão para evitar a AsSpan 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];
        ...
    }
}

Gorjeta

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

Correção de código para CA1832 - Use AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz

Você também pode evitar esse aviso adicionando uma transmissã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 desta regra se a intenção de criar uma cópia.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Consulte também