CA1878: Upřednostněte vlastnosti ReadOnlySpan před poli polí jen pro čtení

Property Hodnota
Identifikátor pravidla CA1878
Titul Preferovat vlastnosti ReadOnlySpan před poli polí jen pro čtení
Kategorie výkon
Oprava je destruktivní nebo nedestruktivní Nezlomitelný
Ve výchozím nastavení povoleno v .NET 11 Jako návrh
Příslušné jazyky jazyk C#

Cause

Pole privátního statického pole s jednorozměrným čtením obsahuje podporované konstantní hodnoty a všechna pozorovaná použití je možné bezpečně přepsat, aby používala ReadOnlySpan<T> vlastnost.

Popis pravidla

Statické pole pole jen pro čtení vyžaduje přidělení spravovaného pole. ReadOnlySpan<T> Když vlastnost vrátí podporovaná konstantní data, kompilátor jazyka C# může snížit data bez přidělení spravovaného pole. Nahrazení pole vlastností může snížit přidělení při zachování přístupu jen pro čtení k datům.

Analyzátor podporuje následující typy prvků:

  • bool, bytea sbyte jsou podporovány, kdykoli ReadOnlySpan<T> je k dispozici.
  • short, ushort, , intchar, , floatuintulonglonga double jsou podporovány pouze v případě, že cílová kompilace zveřejňuje veřejnou statickou RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) metodu. .NET 7 a novějších referenčních sestaveních tuto metodu zpřístupňují.

Analyzátor nediagnostikuje pole decimal, , nint, nuintvýčtové typy, libovolné struktury nebo odkazové typy. Také nediagnostikuje rozostřená pole ani multidimenzionální pole.

Jak opravit porušení

Nahraďte pole pole vlastností s výrazem, která vrací ReadOnlySpan<T>.

Oprava kódu přepíše oprávněné využití pole. U podporovaných AsSpan volání odebere redundantní volání nebo nahradí volání ekvivalentní operací rozsahu, například Slice. Oprava kódu se nenabízí, když nedokáže zachovat sémantiku každého použití.

Example

Následující fragment kódu ukazuje porušení ca1878:

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

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

Následující fragment kódu opraví porušení zásad:

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

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

Kdy potlačit upozornění

Potlačit upozornění, pokud záměrně zachováte identitu nebo proměnlivost pole nebo pokud zachování kompatibility rozhraní API vyžaduje, aby člen zůstal pole pole. Pravidlo hlásí pouze soukromá statická pole jen pro čtení, jejichž pozorované využití je možné bezpečně přepsat.

Potlačte upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Chcete-li pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost na none v konfiguračním souboru .

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Viz také