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.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA1831 |
| Název | Tam, kde je to možné, používat u řetězců místo indexerů založených na rozsahu metodu AsSpan |
| Kategorie | Výkon |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Jako upozornění |
| Příslušné jazyky | C# a Visual Basic |
Příčina
U řetězce se používá indexátor rozsahu a hodnota je implicitně přiřazena na ReadOnlySpan<char>.
Popis pravidla
Toto pravidlo se aktivuje, když v řetězci použijete indexer rozsahu a přiřadíte ho k typu span. Indexer rozsahu v objektu Span<T> je nekopírovací Slice operace, ale pro indexer rozsahu v řetězci bude použita metoda Substring místo Slice. Tím se vytvoří kopie požadované části řetězce. Tato kopie je obvykle nepotřebná, pokud se implicitně používá jako hodnota ReadOnlySpan<T> nebo ReadOnlyMemory<T>. Pokud není kopie zamýšlená, použijte metodu AsSpan , abyste se vyhnuli nepotřebné kopii. Pokud je kopie zamýšlená, buď ji nejprve přiřaďte místní proměnné, nebo přidejte explicitní přetypování. Analyzátor hlásí pouze při použití implicitního přetypování na výsledek operace indexeru rozsahu.
Zjišťuje
Implicitní převod:
ReadOnlySpan<char> slice = str[a..b];
Nezjistí se
Explicitní převod:
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];
Jak opravit porušení
Pokud chcete opravit porušení tohoto pravidla, použijte AsSpan místo indexeru Rangezaloženého na řetězci, abyste se vyhnuli vytváření nepotřebných kopií dat.
public void TestMethod(string str)
{
// The violation occurs
ReadOnlySpan<char> slice = str[1..3];
...
}
public void TestMethod(string str)
{
// The violation fixed with AsSpan extension method
ReadOnlySpan<char> slice = str.AsSpan()[1..3];
...
}
Tip
Oprava kódu je k dispozici pro toto pravidlo v sadě Visual Studio. Pokud ho chcete použít, umístěte kurzor na chybu a stiskněte
Můžete také přidat explicitní přetypování, abyste se vyhnuli tomuto upozornění.
public void TestMethod(string str)
{
// The violation occurs.
ReadOnlySpan<char> slice = str[1..3];
...
}
public void TestMethod(string str)
{
// The violation avoided with explicit casting.
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
...
}
Kdy potlačit upozornění
Pokud chcete vytvořit kopii, je bezpečné potlačit porušení tohoto pravidla.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA1831.severity = none
Chcete-li tuto celou kategorii pravidel zakázat, nastavte závažnost kategorie na none hodnotu v konfiguračním souboru.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Související pravidla
- CA1832: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole ReadOnlySpan nebo ReadOnlyMemory.
- CA1833: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole Span nebo Memory.