Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| 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,byteensbyteworden ondersteund wanneer ReadOnlySpan<T> deze beschikbaar is. -
short, , ,float,longenulongdoubleworden 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.