CA1846: Dávejte přednost AsSpan před Substring

Vlastnost Hodnota
ID pravidla CA1846
Název Raději AsSpan než Substring
Kategorie Výkon
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Výsledek volání na jedno z přetížení String.Substring je předán metodě, která má dostupné přetížení akceptující ReadOnlySpan<Char>.

Popis pravidla

Substring přidělí nový string objekt v haldě a provede úplnou kopii extrahovaného textu. Manipulace s řetězci je kritickým bodem výkonu pro mnoho programů. Přidělení mnoha malých krátkodobých řetězců na horké cestě může vytvořit dostatečný tlak kolekce, aby ovlivnil výkon. Kopie O(n) vytvořené prostřednictvím Substring se stanou relevantními, když podřetězce nabývají velkých rozměrů. Typy Span<T> a ReadOnlySpan<T> byly vytvořeny k vyřešení těchto problémů s výkonem.

Mnoho rozhraní API, která přijímají řetězce, má také přetížené varianty, které přijímají ReadOnlySpan<System.Char> argument. Pokud jsou taková přetížení k dispozici, můžete zvýšit výkon voláním AsSpan místo Substring.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, nahraďte volání string.Substring voláním jedné z MemoryExtensions.AsSpan metod rozšíření.

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

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla, pokud výkon není problém.

Viz také