Condividi tramite


CA1846: Preferisce AsSpan rispetto a Substring

Proprietà valore
ID regola CA1846
Title Preferisce AsSpan rispetto a Substring
Categoria Prestazioni
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 Come suggerimento
Linguaggi applicabili C# e Visual Basic

Causa

Il risultato di una chiamata a uno degli String.Substring sovraccarichi viene passato a un metodo con uno dei sovraccarichi disponibili 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 assumono rilevanza quando le sottostringhe diventano lunghe. I Span<T> tipi e ReadOnlySpan<T> sono stati creati per risolvere questi problemi di prestazioni.

Molte API che accettano stringhe hanno anche sovraccarichi che accettano un argomento ReadOnlySpan<System.Char>. 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