CA1846: Raději než AsSpan
Substring
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 9 | 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.