Share via


CA1832: Använd AsSpan eller AsMemory i stället för Intervallbaserade indexerare för att hämta ReadOnlySpan- eller ReadOnlyMemory-delen av en matris

Property Värde
Regel-ID CA1832
Title Använd AsSpan eller AsMemory i stället för Intervallbaserade indexerare för att hämta ReadOnlySpan- eller ReadOnlyMemory-delen av en matris
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

När du använder en range-indexer på en matris och implicit tilldelar värdet till ReadOnlySpan<T> eller ReadOnlyMemory<T>.

Regelbeskrivning

Intervallindexeraren på en Span<T> är en icke-kopieringsåtgärd Slice . Men för intervallindexeraren i en matris används metoden GetSubArray i stället för Slice, vilket ger en kopia av den begärda delen av matrisen. Den här kopian är vanligtvis onödig när den implicit används som ett ReadOnlySpan<T> eller ReadOnlyMemory<T> -värde. Om en kopia inte är avsedd använder du AsSpan metoden eller AsMemory för att undvika den onödiga kopian. Om kopian är avsedd tilldelar du den till en lokal variabel först eller lägger till en explicit gjutning.

Analysatorn rapporterar endast när en implicit gjutning används på resultatet av range indexer-åtgärden.

Upptäcker

Implicita konverteringar:

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

Identifierar inte

Explicita konverteringar:

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

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln använder du AsSpan metoden eller AsMemory tilläggsmetoden för att undvika att skapa onödiga datakopior.

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];
        ...
    }
}

Dricks

En kodkorrigering är tillgänglig för den här regeln i Visual Studio. Om du vill använda den placerar du markören på överträdelsen och trycker på Ctrl+. (punkt). Välj Använd AsSpan i stället för den intervallbaserade indexeraren i en matris i listan över alternativ som visas.

Code fix for CA1832 - Use AsSpan or AsMemory instead of Range-based indexers for getting ReadOnlySpan or ReadOnlyMemory portion of an array

Du kan också undvika den här varningen genom att lägga till en explicit gjutning.

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];
        ...
    }
}

När du ska ignorera varningar

Det är säkert att förhindra en överträdelse av den här regeln om du vill skapa en kopia.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA1832.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även