Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
CA1846:
| Eigenschaft | Wert |
|---|---|
| Regel-ID | CA1846 |
| Titel |
AsSpan gegenüber Substring bevorzugen. |
| Kategorie | Leistung |
| Fix führt zu Unterbrechungen oder bleibt funktionsfähig | Untrennbar |
| Standardmäßig in .NET 10 aktiviert | Als Vorschlag |
| Anwendbare Sprachen | C# und Visual Basic |
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 ist für viele Programme eine Leistungsbremse. Das Zuordnen vieler kleiner, kurzlebiger Zeichenfolgen auf einem kritischen Pfad kann genug Druck auf den Garbage Collector erzeugen, um die Leistung zu beeinträchtigen. 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.
So beheben Sie Verstöße
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.