Partilhar via


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.

Consulte também