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

Zjistí

Implicitní převody:

  • Span<SomeT> slice = arr[a..b];
  • Memory<SomeT> slice = arr[a..b];

Nerozpozná

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 .

Code fix for CA1833 - Use AsSpan or AsMemory instead of Range-based indexers for getting Span or Memory portion of an array

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.

Viz také