Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| 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,byteochsbytestöds när det ReadOnlySpan<T> är tillgängligt. -
short,ushort,char,int,uint,float,long, ochulongdoublestö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.