Sdílet prostřednictvím


CA1832: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole ReadOnlySpan nebo ReadOnlyMemory.

Vlastnost Hodnota
ID pravidla CA1832
Název Pro získání části ReadOnlySpan nebo ReadOnlyMemory 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 ReadOnlySpan<T> nebo ReadOnlyMemory<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 ReadOnlySpan<T> hodnota.ReadOnlyMemory<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:

  • ReadOnlySpan<SomeT> slice = arr[a..b];
  • ReadOnlyMemory<SomeT> slice = arr[a..b];

Nezjistí se

Explicitní převody:

  • ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
  • ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<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
        ReadOnlySpan<byte> tmp1 = arr[0..2];
        ReadOnlyMemory<byte> tmp3 = arr[5..8];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violations fixed with AsSpan or AsMemory accordingly
        ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
        ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
        ...
    }
}

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 asSpan místo indexeru založeného na rozsahu na poli .

Oprava kódu pro CA1832 – Použití asSpanu nebo AsMemory místo indexerů založených na rozsahu pro získání části pole ReadOnlySpan nebo ReadOnlyMemory

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
        ReadOnlySpan<byte> tmp1 = arr[0..2];
        ReadOnlyMemory<byte> tmp3 = arr[5..8];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation fixed with explicit casting
        ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
        ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
        ...
    }
}

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 CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832

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.CA1832.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také