CA1833: Pro získání části pole Span nebo Memory používejte AsSpan nebo AsMemory místo indexerů založených na rozsahu.

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, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Při použití indexeru rozsahu na pole a implicitním přiřazování hodnoty do Span<T> nebo Memory<T>.

Popis pravidla

Indexer pro rozsah v objektu Span<T> je operace Slice bez kopírování. Ale pro indexer rozsahu v poli bude použita metoda GetSubArray místo Slice, což vytvoří kopii požadované části pole. Tato kopie je obvykle nepotřebná, pokud se implicitně používá jako hodnota Span<T> nebo Memory<T>. Pokud kopie není zamýšlená, použijte metodu AsSpan nebo AsMemory, abyste se vyhnuli zbytečné 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ř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 chybu 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 .

Oprava kódu pro CA1833 – Použití AsSpan nebo AsMemory místo indexerů založených na Range pro získání části pole typu Span nebo Memory

Také se můžete tomuto upozornění vyhnout 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.

Viz také