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 9 | 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.
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 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.
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.