CA1846: Prefira AsSpan
mais Substring
Property | valor |
---|---|
ID da regra | CA1846 |
Título | Prefira AsSpan mais Substring |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
O resultado de uma chamada para uma das String.Substring sobrecargas é passado para um método com uma sobrecarga disponível que aceita ReadOnlySpan<Char>
.
Descrição da regra
Substring
Aloca um novo string
objeto na pilha e executa uma cópia completa do texto extraído. A manipulação de cadeias de caracteres é um gargalo de desempenho para muitos programas. Alocar muitas cadeias de caracteres pequenas e de curta duração em um caminho quente pode criar pressão de coleta suficiente para afetar o desempenho. As cópias O(n) criadas por Substring
tornam-se relevantes quando as substrings ficam grandes. Os Span<T> e ReadOnlySpan<T> tipos foram criados para resolver esses problemas de desempenho.
Muitas APIs que aceitam cadeias de caracteres também têm sobrecargas que aceitam um ReadOnlySpan<System.Char>
argumento. Quando essas sobrecargas estiverem disponíveis, você poderá melhorar o desempenho chamando AsSpan
em vez de Substring
.
Como corrigir violações
Para corrigir uma violação dessa regra, substitua a chamada para string.Substring
por uma chamada para um dos métodos de MemoryExtensions.AsSpan extensão.
using System;
public void MyMethod(string iniFileLine)
{
// Violation
int.TryParse(iniFileLine.Substring(7), out int x);
int.TryParse(iniFileLine.Substring(2, 5), out int y);
// Fix
int.TryParse(iniFileLine.AsSpan(7), out int x);
int.TryParse(iniFileLine.AsSpan(2, 5), out int y);
}
Imports System
Public Sub MyMethod(iniFileLine As String)
Dim x As Integer
Dim y As Integer
' Violation
Integer.TryParse(iniFileLine.Substring(7), x)
Integer.TryParse(iniFileLine.Substring(2, 5), y)
' Fix
Integer.TryParse(iniFileLine.AsSpan(7), x)
Integer.TryParse(iniFileLine.AsSpan(2, 5), y)
End Sub
Quando suprimir avisos
É seguro suprimir avisos desta regra se o desempenho não for uma preocupação.