Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
CA1846: Prefira
| Propriedade | valor |
|---|---|
| ID da regra | CA1846 |
| Título | Prefira AsSpan em vez de Substring |
| Categoria | Desempenho |
| A correção causa interrupção ou não | Ininterrupto |
| Habilitado por padrão no .NET 10 | Como sugestão |
| Línguas aplicáveis | C# e Visual Basic |
Motivo
O resultado de uma chamada para uma das sobrecargas de String.Substring é passado para um método cuja sobrecarga disponível 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 se tornam 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 desta 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 desta regra se o desempenho não for uma preocupação.