CA1878: Prefer ReadOnlySpan properties over readonly array fields

Property Waarde
Regel-ID CA1878
Title Voorkeur geven aan ReadOnlySpan-eigenschappen ten opzichte van alleen-lezen matrixvelden
Categorie prestatie
Fix kan brekend of niet-brekend zijn Non-breaking
Standaard ingeschakeld in .NET 11 Als suggestie
Toepasselijke talen C#

Oorzaak

Een persoonlijk statisch eendimensionaal matrixveld bevat ondersteunde constante waarden en alle waargenomen gebruikswaarden kunnen veilig worden herschreven om een ReadOnlySpan<T> eigenschap te gebruiken.

Beschrijving van regel

Voor een statisch alleen-lezen matrixveld is een beheerde matrixtoewijzing vereist. Wanneer een ReadOnlySpan<T> eigenschap ondersteunde constante gegevens retourneert, kan de C#-compiler de gegevens verlagen zonder een beheerde matrix toe te wijzen. Als u het veld vervangt door een eigenschap, kunnen toewijzingen worden verminderd terwijl alleen-lezentoegang tot de gegevens behouden blijft.

De analyzer ondersteunt de volgende elementtypen:

  • bool, byteen sbyte worden ondersteund wanneer ReadOnlySpan<T> deze beschikbaar is.
  • short, , , float, longen ulongdouble worden alleen ondersteund wanneer de doelcompilatie de openbare statische RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) methode beschikbaar maakt. ushortcharintuint .NET 7 en latere referentieassembly's maken deze methode beschikbaar.

De analyse diagnosticeert geen matrices van decimal, nint, enumtypen nuint, willekeurige structs of verwijzingstypen. Er wordt ook geen diagnose gesteld voor onregelmatige matrices of multidimensionale matrices.

Hoe schendingen op te lossen

Vervang het matrixveld door een expressie-bodied eigenschap die als resultaat geeft ReadOnlySpan<T>.

Met de codefix worden in aanmerking komende gebruiksrechten van het veld herschreven. Voor ondersteunde AsSpan aanroepen wordt een redundante aanroep verwijderd of wordt de aanroep vervangen door een equivalente spanbewerking, zoals Slice. De codeoplossing wordt niet aangeboden wanneer de semantiek van elk gebruik niet kan worden behouden.

Example

Het volgende codefragment toont een schending van CA1878:

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

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

Met het volgende codefragment wordt de schending opgelost:

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

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

Wanneer waarschuwingen onderdrukken

Onderdrukt een waarschuwing als u de identiteit of de mutabiliteit van de matrix opzettelijk behoudt, of als het behouden van API-compatibiliteit vereist dat het lid een matrixveld blijft. De regel rapporteert alleen persoonlijke statische leesvelden waarvan waargenomen gebruik veilig kan worden herschreven.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.

Zie ook