Partilhar via


CA1846: Prefira AsSpan mais Substring

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.

Consulte também