CA1831: Místo indexerů založených na rozsahu použijte pro string AsSpan, pokud je to vhodné

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 Ctrl. (tečka). Zvolte Použijte AsSpan místo indexeru založeného na rozsahu na řetězci ze seznamu zobrazených možností.

Oprava kódu pro CA1831 – Pokud je to vhodné, použijte asSpan místo indexerů založených na rozsahu

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.

Viz také