Partilhar via


CA1831: Use AsSpan em vez de indexadores baseados em Range para string quando apropriado

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

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 se usa um indexador de intervalo em uma string e a atribui a um tipo Span. 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ó informa 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 desta regra, use AsSpan em vez do indexador baseado em Range 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 utilizá-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.

Correção de código para CA1831 - Use AsSpan em vez de indexadores baseados em intervalo quando apropriado

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade 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