CA1833: Use AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte Span ou Memory de uma matriz
Property | valor |
---|---|
ID da regra | CA1833 |
Título | Use AsSpan ou AsMemory em vez de indexadores baseados em Range para obter a parte Span ou Memory de uma matriz |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
Ao usar um indexador de intervalo em uma matriz e atribuir implicitamente o valor a Span<T> ou Memory<T>.
Descrição da regra
O indexador de intervalo em um Span<T> é uma operação que não copia.Slice Mas para o indexador de intervalo em uma matriz, o método GetSubArray será usado em vez de Slice, que produz uma cópia da parte solicitada da matriz. Essa cópia geralmente é desnecessária quando é implicitamente usada como um Span<T> ou Memory<T> valor. Se uma cópia não for pretendida, use o AsSpan método ou AsMemory 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ões implícitas:
Span<SomeT> slice = arr[a..b];
Memory<SomeT> slice = arr[a..b];
Não deteta
Conversões explícitas:
Span<SomeT> slice = (Span<SomeT>)arr[a..b];
Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];
Como corrigir violações
Para corrigir uma violação dessa regra, use o método ou AsMemory extensão para evitar a AsSpan criação de cópias de dados desnecessárias.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
Span<byte> tmp2 = arr[0..5];
Memory<byte> tmp4 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
Span<byte> tmp2 = arr.AsSpan()[0..5];
Memory<byte> tmp4 = arr.AsMemory()[5..10];
...
}
}
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 AsMemory em vez do indexador baseado em Intervalo em uma matriz na lista de opções apresentada.
Você também pode evitar esse aviso adicionando uma transmissão explícita.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
Span<byte> tmp1 = arr[0..5];
Memory<byte> tmp2 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
Span<byte> tmp1 = (Span<byte>)arr[0..5];
Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
...
}
}
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 CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1833.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Regras conexas
- CA1831: Use AsSpan em vez de indexadores baseados em intervalo para cadeia de caracteres quando apropriado
- CA1832: Use AsSpan ou AsMemory em vez de indexadores baseados em intervalo para obter a parte ReadOnlySpan ou ReadOnlyMemory de uma matriz