Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
CA1846: Preferir
| 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 10 | 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.