CA1878: Föredrar ReadOnlySpan-egenskaper framför skrivskyddade matrisfält

Property Värde
Regel-ID CA1878
Titel Föredra ReadOnlySpan-egenskaper framför skrivskyddade matrisfält
Kategori Föreställning
Korrigeringen är antingen brytande eller icke-brytande Oumbrytbar
Aktiverad som standard i .NET 11 Som förslag
Tillämpliga språk C#

Orsak

Ett privat statiskt skrivskyddat endimensionellt matrisfält innehåller konstanta värden som stöds och alla observerade användningar kan skrivas om på ett säkert sätt för att använda en ReadOnlySpan<T> egenskap.

Regelbeskrivning

Ett statiskt skrivskyddat matrisfält kräver en hanterad matrisallokering. När en ReadOnlySpan<T> egenskap returnerar konstanta data som stöds kan C#-kompilatorn sänka data utan att allokera en hanterad matris. Om du ersätter fältet med en egenskap kan du minska allokeringen samtidigt som skrivskyddad åtkomst till data bevaras.

Analysatorn stöder följande elementtyper:

  • bool, byteoch sbyte stöds när det ReadOnlySpan<T> är tillgängligt.
  • short, ushort, char, int, uint, float, long, och ulongdouble stöds endast när målkompilering exponerar den offentliga statiska RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) metoden. .NET 7 och senare referenssammansättningar exponerar den här metoden.

Analysatorn diagnostiserar inte matriser med decimal, nint, nuint, uppräkningstyper, godtyckliga structs eller referenstyper. Den diagnostiserar inte heller ojämna matriser eller flerdimensionella matriser.

Så här åtgärdar du överträdelser

Ersätt matrisfältet med en expression-bodied-egenskap som returnerar ReadOnlySpan<T>.

Kodkorrigeringen skriver om berättigade användningar av fältet. För anrop som stöds AsSpan tar det bort ett redundant anrop eller ersätter anropet med en motsvarande span-åtgärd, till exempel Slice. Kodkorrigeringen erbjuds inte när den inte kan bevara semantiken för varje användning.

Example

Följande kodfragment visar ett brott mot CA1878:

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

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

Följande kodfragment åtgärdar överträdelsen:

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

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

När du ska ignorera varningar

Ignorera en varning om du avsiktligt behåller matrisens identitet eller föränderlighet, eller om bevarande av API-kompatibilitet kräver att medlemmen förblir ett matrisfält. Regeln rapporterar endast privata statiska skrivskyddade fält vars observerade användning kan skrivas om på ett säkert sätt.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Se även