CA1831: Místo indexerů založených na rozsahu použijte pro řetězec 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 způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako upozornění

Příčina

V řetězci se používá indexer rozsahu a hodnota je implicitně přiřazena ReadOnlySpan<char>.

Popis pravidla

Toto pravidlo se aktivuje, když v řetězci použijete indexer rozsahu a přiřadíte ho k typu rozsahu. 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 ReadOnlySpan<T> hodnota.ReadOnlyMemory<T> Pokud není kopie zamýšlená, použijte metodu AsSpan , abyste se vyhnuli nepotřebné kopii. Pokud je kopie určená, přiřaďte ji nejprve 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.

Zjistí

Implicitní převod:

ReadOnlySpan<char> slice = str[a..b];

Nerozpozná

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 porušení a stiskněte ctrl+. (tečka). Místo indexeru založeného na rozsahu na řetězci v seznamu zobrazených možností zvolte Použít asSpan.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

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é