Compartilhar via


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.

Confira também