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