Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| 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,byteesbytesono supportati ogni volta che ReadOnlySpan<T> è disponibile. -
short,ushort,int,uint,floatlong, , ,ulongedoublesono 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.