Share via


CA1831: Use AsSpan em vez de indexadores baseados em intervalo para cadeia de caracteres quando apropriado

Property valor
ID da regra CA1831
Título Use AsSpan em vez de indexadores baseados em intervalo para cadeia de caracteres quando apropriado
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Como aviso

Motivo

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

Descrição da regra

Esta regra é acionada quando você usa um indexador de intervalo em uma cadeia de caracteres e o atribui a um tipo de extensão. O indexador de intervalo em um Span<T> é uma operação de não cópia Slice , mas 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 é implicitamente usada como um ReadOnlySpan<T> ou ReadOnlyMemory<T> valor. Se uma cópia não for pretendida, use o AsSpan método 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ó relata quando um molde implícito é usado no resultado da operação do indexador de intervalo.

Deteta

Conversão implícita:

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

Não deteta

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 Rangeindexador baseado em -na 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];
    ...
}

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 cadeia de caracteres na lista de opções apresentada.

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

Você também pode adicionar uma transmissã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 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 CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831

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

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

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

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

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

Consulte também