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.
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.
Regras relacionadas
- CA1832: Usar AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz
- CA1833: Usar AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte Span ou Memory de uma matriz