Share via


CA1846: Raději než AsSpanSubstring

Vlastnost Hodnota
ID pravidla CA1846
Název Raději AsSpan než Substring
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Výsledek volání jednoho z String.Substring přetížení je předán metodě s dostupným přetížením, které přijímá 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é při Substring velké velikosti podřetězců se stanou relevantními. Tyto Span<T> problémy s výkonem byly vytvořeny a ReadOnlySpan<T> typy 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í, 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í

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

Viz také