Partilhar via


CA1832: Utilize AsSpan ou AsMemory em vez de indexadores baseados em intervalos para obter uma porção ReadOnlySpan ou ReadOnlyMemory de uma matriz.

Propriedade 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 causa interrupção ou não Ininterrupto
Habilitado por padrão no .NET 10 Como sugestão
Línguas aplicáveis C# e Visual Basic

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 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 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 desta regra, use 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];
        ...
    }
}

Gorjeta

Uma correção de código está disponível para essa regra no Visual Studio. Para utilizá-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 criação de uma cópia for intencionada.

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