Udostępnij za pośrednictwem


CA1833: Używaj metod AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie do uzyskiwania segmentów Span lub Memory z tablicy.

Właściwości Wartość
Identyfikator reguły CA1833
Tytuł Użyj AsSpan lub AsMemory zamiast indeksatorów zakresowych do uzyskania części Span lub Memory dla tablicy.
Kategoria Wydajność
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako sugestia
Zastosowane języki C# i Visual Basic

Przyczyna

Podczas używania indeksatora zakresowego na tablicy i niejawnego przypisywania wartości do elementu Span<T> lub Memory<T>.

Opis reguły

Indeks zakresu w obiekcie Span<T> jest operacją Slice bez kopiowania. Jednak w przypadku indeksatora zakresu w tablicy metoda GetSubArray zostanie użyta zamiast Slice, która generuje kopię żądanej części tablicy. Ta kopia jest zwykle niepotrzebna, gdy jest niejawnie używana jako wartość Span<T> lub Memory<T>. Jeśli kopia nie jest zamierzona, użyj metody AsSpan lub AsMemory, aby uniknąć niepotrzebnej kopii. Jeśli kopiowanie jest zamierzone, najpierw przypisz ją do zmiennej lokalnej lub użyj jawnego rzutowania. Analizator raportuje tylko wtedy, gdy do wyniku operacji indeksacji zakresu stosowane jest niejawne rzutowanie.

Wykrywa

Niejawne konwersje:

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

Nie wykrywa

Konwersje jawne:

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

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, użyj AsSpan metody lub AsMemory rozszerzenia, aby uniknąć tworzenia niepotrzebnych kopii danych.

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

Wskazówka

Poprawka kodu jest dostępna dla tej reguły w programie Visual Studio. Aby go użyć, umieść kursor na naruszeniu i naciśnij Ctrl+. (kropka). Wybierz Użyj AsMemory zamiast indeksatora opartego na zakresie na tablicy z listy przedstawionych opcji.

Poprawka kodu dla CA1833 — użyj AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie, aby uzyskać fragment Span lub Memory tablicy

Możesz również uniknąć tego ostrzeżenia, dodając jawne rzutowanie.

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

Kiedy pomijać ostrzeżenia

Bezpiecznie można zignorować naruszenie tej reguły, jeśli zamierzone jest tworzenie kopii.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Zobacz też