CA1831: Użyj narzędzia AsSpan zamiast indeksatorów opartych na zakresie dla ciągu, jeśli jest to konieczne
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1831 |
Tytuł | Użyj metody AsSpan zamiast indeksatorów opartych na zakresie dla ciągów, gdy ma to zastosowanie |
Kategoria | Wydajność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 8 | Jako ostrzeżenie |
Przyczyna
Indeksator zakresu jest używany w ciągu, a wartość jest niejawnie przypisywana do ReadOnlySpan<char>
elementu .
Opis reguły
Ta reguła jest uruchamiana, gdy używasz indeksatora zakresu w ciągu i przypiszesz go do typu zakresu. Indeksator zakresu w obiekcie Span<T> jest operacją bez kopiowaniaSlice, ale w przypadku indeksatora zakresu w ciągu metoda zostanie użyta zamiast Slice.Substring Spowoduje to utworzenie kopii żądanej części ciągu. 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 , 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
Niejawna konwersja:
ReadOnlySpan<char> slice = str[a..b];
Nie wykrywa
Konwersja jawna:
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, użyj AsSpan zamiast indeksatora opartego Rangena ciągu, aby uniknąć tworzenia niepotrzebnych kopii danych.
public void TestMethod(string str)
{
// The violation occurs
ReadOnlySpan<char> slice = str[1..3];
...
}
public void TestMethod(string str)
{
// The violation fixed with AsSpan extension method
ReadOnlySpan<char> slice = str.AsSpan()[1..3];
...
}
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 klawisze Ctrl+. (kropka). Wybierz pozycję Użyj asSpan zamiast indeksatora opartego na zakresie na ciągu z listy przedstawionych opcji.
Możesz również dodać jawne rzutowanie, aby uniknąć tego ostrzeżenia.
public void TestMethod(string str)
{
// The violation occurs.
ReadOnlySpan<char> slice = str[1..3];
...
}
public void TestMethod(string str)
{
// The violation avoided with explicit casting.
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
...
}
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 CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1831.severity = none
Aby wyłączyć tę całą kategorię reguł, ustaw ważność dla kategorii na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Powiązane reguły
- CA1832: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie, aby uzyskać fragment ReadOnlySpan lub ReadOnlyMemory tablicy
- CA1833: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie do pobierania części span lub pamięci tablicy