Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
CA1846: Preferisce
| Proprietà | valore |
|---|---|
| ID regola | CA1846 |
| Title | Preferisce AsSpan rispetto a Substring |
| Categoria | Prestazioni |
| La correzione causa un'interruzione o meno | Non causa un'interruzione |
| Abilitato per impostazione predefinita in .NET 10 | 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.