CA1832: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie, aby uzyskać fragment ReadOnlySpan lub ReadOnlyMemory tablicy
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1832 |
Tytuł | Użyj metody AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie do pobierania części ReadOnlySpan lub ReadOnlyMemory dla tablicy |
Kategoria | Wydajność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
W przypadku używania indeksatora zakresów w tablicy i niejawnego przypisywania wartości do ReadOnlySpan<T> elementu lub ReadOnlyMemory<T>.
Opis reguły
Indeksator zakresu w obiekcie Span<T> jest operacją bez kopiowania Slice . 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 ReadOnlySpan<T> wartość lub ReadOnlyMemory<T> . Jeśli kopia nie jest przeznaczona, użyj AsSpan metody lub AsMemory , aby uniknąć niepotrzebnej kopii. Jeśli kopia jest przeznaczona, najpierw przypisz ją do zmiennej lokalnej lub dodaj jawne rzutowanie.
Analizator raportuje tylko wtedy, gdy niejawne rzutowanie jest używane w wyniku operacji indeksatora zakresu.
Wykrywa
Niejawne konwersje:
ReadOnlySpan<SomeT> slice = arr[a..b];
ReadOnlyMemory<SomeT> slice = arr[a..b];
Nie wykrywa
Konwersje jawne:
ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<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
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];
...
}
}
Napiwek
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 pozycję Użyj asSpan zamiast indeksatora opartego na zakresie na tablicy z listy przedstawionych opcji.
Możesz również uniknąć tego ostrzeżenia, dodając jawne rzutowanie.
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];
...
}
}
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć naruszenie tej reguły, jeśli tworzenie kopii jest zamierzone.
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 CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1832.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Powiązane reguły
- CA1831: Użyj narzędzia AsSpan zamiast indeksatorów opartych na zakresie dla ciągu, jeśli jest to konieczne
- CA1833: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie do pobierania części span lub pamięci tablicy