CA1878: Preferuj właściwości ReadOnlySpan dla pól tablicy tylko do odczytu

Property Wartość
Identyfikator reguły CA1878
Title Preferuj właściwości ReadOnlySpan nad polami tablicy tylko do odczytu
Kategoria Wydajność
Poprawka jest przełomowa lub nieprzełomowa Non-breaking
Domyślnie włączone w .NET 11 Jako sugestia
Zastosowane języki C#

Przyczyna

Prywatne statyczne jednowymiarowe pole tablicy jednowymiarowej zawiera obsługiwane wartości stałe, a wszystkie zaobserwowane użycia można bezpiecznie przepisać do użycia ReadOnlySpan<T> właściwości.

Opis reguły

Statyczne pole tablicy odczytu wymaga alokacji tablicy zarządzanej. ReadOnlySpan<T> Gdy właściwość zwraca obsługiwane dane stałe, kompilator języka C# może obniżyć dane bez przydzielania tablicy zarządzanej. Zastąpienie pola właściwością może zmniejszyć alokacje, zachowując jednocześnie dostęp tylko do odczytu do danych.

Analizator obsługuje następujące typy elementów:

  • bool, bytei sbyte są obsługiwane za każdym razem, gdy ReadOnlySpan<T> jest dostępny.
  • short, , ushortuintintcharlongulongfloat, i double są obsługiwane tylko wtedy, gdy kompilacja docelowa uwidacznia publiczną metodę statyczną.RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) .NET 7 i nowszych zestawów odwołań uwidacznia tę metodę.

Analizator nie diagnozuje tablic decimal, nint, nuint, typów wyliczeniowych, dowolnych struktur ani typów odwołań. Nie diagnozuje również tablic postrzępionych ani tablic wielowymiarowych.

Jak naprawić naruszenia

Zastąp pole tablicy właściwością typu expression-bodied zwracającą wartość ReadOnlySpan<T>.

Poprawka kodu ponownie zapisuje kwalifikujące się użycie pola. W przypadku obsługiwanych AsSpan wywołań usuwa nadmiarowe wywołanie lub zastępuje wywołanie równoważną operacją span, taką jak Slice. Poprawka kodu nie jest oferowana, gdy nie może zachować semantyki każdego użycia.

Example

Poniższy fragment kodu przedstawia naruszenie ca1878:

class CA1878ViolationExample
{
    private static readonly byte[] Prefix = new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

Poniższy fragment kodu naprawia naruszenie:

class CA1878FixExample
{
    private static ReadOnlySpan<byte> Prefix => new byte[] { 0x50, 0x4B, 0x03, 0x04 };

    public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}

Kiedy pomijać ostrzeżenia

Pomiń ostrzeżenie, jeśli celowo zachowasz tożsamość tablicy lub niezmienność, lub jeśli zachowanie zgodności interfejsu API wymaga, aby element członkowski pozostał polem tablicy. Reguła zgłasza tylko prywatne pola odczytu statycznego, których obserwowane użycie można bezpiecznie przepisać.

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

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

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

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

Zobacz także