CA1846: Preferir AsSpan
em vez de Substring
Property | Valor |
---|---|
ID da regra | CA1846 |
Título | Prefira AsSpan a Substring |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Como sugestão |
Causa
O resultado de uma chamada para uma das sobrecargas String.Substring é passado para um método com uma sobrecarga disponível que aceita ReadOnlySpan<Char>
.
Descrição da regra
Substring
aloca um novo objeto string
no heap e executa uma cópia completa do texto extraído. A manipulação de cadeia de caracteres é um gargalo de desempenho para muitos programas. Alocar muitas cadeias de caracteres pequenas e de curta duração em um caminho crítico 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 tipos Span<T> e ReadOnlySpan<T> foram criados para resolver esses problemas de desempenho.
Muitas APIs que aceitam cadeias de caracteres também têm sobrecargas que aceitam um argumento ReadOnlySpan<System.Char>
. Quando essas sobrecargas estão disponíveis, você pode 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 extensão MemoryExtensions.AsSpan.
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 dessa regra se o desempenho não for uma preocupação.