CA1878: Preferisce le proprietà ReadOnlySpan su campi di matrice di sola lettura

Proprietà Valore
ID della regola CA1878
Title Preferisce le proprietà ReadOnlySpan rispetto ai campi di matrice readonly
Categoria Prestazioni
La modifica è dirompente o non dirompente Non rompente
Abilitato per impostazione predefinita in .NET 11 Come suggerimento
Linguaggi applicabili C#

Cause

Un campo di matrice statico statico privato unidimensionale contiene valori costanti supportati e tutti gli utilizzi osservati possono essere riscritti in modo sicuro per usare una ReadOnlySpan<T> proprietà.

Descrizione della regola

Un campo matrice di sola lettura statico richiede un'allocazione di matrice gestita. Quando una ReadOnlySpan<T> proprietà restituisce dati costanti supportati, il compilatore C# può ridurre i dati senza allocare una matrice gestita. La sostituzione del campo con una proprietà può ridurre le allocazioni mantenendo l'accesso in sola lettura ai dati.

L'analizzatore supporta i tipi di elemento seguenti:

  • bool, bytee sbyte sono supportati ogni volta che ReadOnlySpan<T> è disponibile.
  • short, ushort, int, uint, floatlong, , , ulonge double sono supportati solo quando la compilazione di destinazione espone il metodo statico RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) pubblico. char .NET 7 e versioni successive gli assembly di riferimento espongono questo metodo.

L'analizzatore non esegue la diagnosi di matrici di decimaltipi , nint, nuintenumerazione, struct arbitrari o tipi riferimento. Non esegue inoltre la diagnosi di matrici o matrici multidimensionali irregolari.

Come correggere le violazioni

Sostituire il campo matrice con una proprietà con corpo di espressione che restituisce ReadOnlySpan<T>.

La correzione del codice riscrive gli utilizzi idonei del campo. Per le chiamate supportate AsSpan , rimuove una chiamata ridondante o sostituisce la chiamata con un'operazione di intervallo equivalente, ad esempio Slice. La correzione del codice non viene offerta quando non riesce a mantenere la semantica di ogni utilizzo.

Esempio

Il frammento di codice seguente mostra una violazione di CA1878:

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

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

Il frammento di codice seguente corregge la violazione:

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

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

Quando eliminare gli avvisi

Eliminare un avviso se si mantiene intenzionalmente l'identità o la mutabilità della matrice o se si mantiene la compatibilità dell'API, è necessario che il membro rimanga un campo di matrice. La regola segnala solo campi statici privati di sola lettura i cui utilizzi osservati possono essere riscritti in modo sicuro.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedere anche