CA1833: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole Span nebo Memory.
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1833 |
Název | Pro získání části Span nebo Memory pole používat místo indexerů založených na rozsahu metodu AsSpan nebo AsMemory |
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 návrh |
Příčina
Při použití indexeru rozsahu v poli a implicitně přiřazování hodnoty do Span<T> nebo Memory<T>.
Popis pravidla
Indexer rozsahu v objektu Span<T> je nekopírovací Slice operace. Ale pro indexer rozsahu v matici bude použita metoda GetSubArray místo Slice, která vytvoří kopii požadované části pole. Tato kopie je obvykle nepotřebná, pokud se implicitně používá jako Span<T> hodnota.Memory<T> Pokud není kopie zamýšlená, použijte ji AsSpan nebo AsMemory metodu, 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řevody:
Span<SomeT> slice = arr[a..b];
Memory<SomeT> slice = arr[a..b];
Nezjistí se
Explicitní převody:
Span<SomeT> slice = (Span<SomeT>)arr[a..b];
Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, použijte metodu AsSpan rozšíření AsMemory , abyste se vyhnuli vytváření nepotřebných kopií dat.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
Span<byte> tmp2 = arr[0..5];
Memory<byte> tmp4 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
Span<byte> tmp2 = arr.AsSpan()[0..5];
Memory<byte> tmp4 = arr.AsMemory()[5..10];
...
}
}
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). V seznamu zobrazených možností zvolte Použít asMemory místo indexeru založeného na rozsahu na poli .
Toto upozornění se můžete vyhnout také přidáním explicitního přetypování.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
Span<byte> tmp1 = arr[0..5];
Memory<byte> tmp2 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
Span<byte> tmp1 = (Span<byte>)arr[0..5];
Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
...
}
}
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 CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833
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.CA1833.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Související pravidla
- CA1831: Místo indexerů založených na rozsahu použijte pro řetězec asSpan, pokud je to vhodné
- CA1832: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole ReadOnlySpan nebo ReadOnlyMemory.