Share via


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.

Siehe auch