CA1831: Usar AsSpan em vez de indexadores baseados em intervalo na cadeia de caracteres quando apropriado

Property Valor
ID da regra CA1831
Título Usar AsSpan em vez de indexadores baseados em intervalo na cadeia de caracteres quando apropriado
Categoria Desempenho
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como aviso

Causa

Um indexador de intervalo é usado em uma cadeia de caracteres e o valor é atribuído implicitamente a ReadOnlySpan<char>.

Descrição da regra

Essa regra é acionada quando você usa um indexador de intervalo em uma cadeia de caracteres e a atribui a um tipo de intervalo. O indexador de intervalo em um Span<T> é uma operação que não copia Slice, porém, para o indexador de intervalo em uma cadeia de caracteres, o método Substring será usado em vez de Slice. Isso produz uma cópia da parte solicitada da cadeia de caracteres. 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 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ão implícita:

ReadOnlySpan<char> slice = str[a..b];

Não detecta

Conversão explícita:

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

Como corrigir violações

Para corrigir uma violação dessa regra, use AsSpan em vez do indexador baseado em Rangena cadeia de caracteres para evitar a criação de cópias de dados desnecessárias.

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

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 baseado em intervalo em uma cadeia de caracteres na lista de opções apresentadas.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

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

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

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 CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831

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.CA1831.severity = none

Para desabilitar toda essa categoria de regras, defina a gravidade da categoria como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

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

Confira também