Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
CA1846: Dávejte přednost
| 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.