CA1846: AsSpan
gegenüber Substring
vorziehen
Eigenschaft | Wert |
---|---|
Regel-ID | CA1846 |
Titel | AsSpan gegenüber Substring bevorzugen. |
Kategorie | Leistung |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Als Vorschlag |
Ursache
Das Ergebnis eines Aufrufs einer der String.Substring-Überladungen wird an eine Methode mit einer verfügbaren Überladung übergeben, die ReadOnlySpan<Char>
akzeptiert.
Regelbeschreibung
Substring
ordnet ein neues string
-Objekt auf dem Heap zu und führt eine vollständige Kopie des extrahierten Texts aus. Die Zeichenfolgenbearbeitung stellt für viele Programme einen Leistungsengpass dar. Das Zuordnen vieler kleiner, kurzlebiger Zeichenfolgen auf dem langsamsten Pfad kann zu einer ausreichend großen Sammlungslast für leistungsbezogene Auswirkungen sorgen. Die von Substring
erstellten O(n)-Kopien werden relevant, wenn die Teilzeichenfolgen groß werden. Die Typen Span<T> und ReadOnlySpan<T> wurden erstellt, um diese Leistungsprobleme zu lösen.
Viele APIs, die Zeichenfolgen akzeptieren, verfügen auch über Überladungen, die ein ReadOnlySpan<System.Char>
-Argument akzeptieren. Wenn solche Überladungen verfügbar sind, können Sie die Leistung verbessern, indem Sie AsSpan
anstelle von Substring
aufrufen.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ersetzen Sie den Aufruf von string.Substring
durch einen Aufruf einer der MemoryExtensions.AsSpan-Erweiterungsmethoden.
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
Wann sollten Warnungen unterdrückt werden?
Es ist sicher, eine Warnung aus dieser Regel zu unterdrücken, wenn Leistung kein Grund zur Besorgnis ist.