CA1846: Preferisce AsSpan rispetto a Substring

Proprietà valore
ID regola CA1846
Title Preferisce AsSpan rispetto a Substring
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Il risultato di una chiamata a uno degli String.Substring overload viene passato a un metodo con un overload disponibile che accetta ReadOnlySpan<Char>.

Descrizione regola

Substring alloca un nuovo string oggetto nell'heap ed esegue una copia completa del testo estratto. La manipolazione delle stringhe è un collo di bottiglia delle prestazioni per molti programmi. L'allocazione di molte stringhe di piccole dimensioni di breve durata in un percorso critico può creare una pressione di raccolta sufficiente per influire sulle prestazioni. Le copie O(n) create da Substring diventano rilevanti quando le sottostringhe diventano grandi. I Span<T> tipi e ReadOnlySpan<T> sono stati creati per risolvere questi problemi di prestazioni.

Molte API che accettano stringhe hanno anche overload che accettano un ReadOnlySpan<System.Char> argomento. Quando tali overload sono disponibili, è possibile migliorare le prestazioni chiamando AsSpan invece di Substring.

Come correggere le violazioni

Per correggere una violazione di questa regola, sostituire la chiamata a string.Substring con una chiamata a uno dei MemoryExtensions.AsSpan metodi di estensione.

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 eliminare gli avvisi

Se le prestazioni non sono un problema, è possibile eliminare gli avvisi da questa regola.

Vedi anche