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.