Regole di prestazioni
Le regole di prestazioni supportano applicazioni e librerie ad alte prestazioni.
In questa sezione
Regola | Descrizione |
---|---|
CA1802: Usa valori letterali dove appropriato | Un campo viene dichiarato statico e di sola lettura (Shared e ReadOnly in Visual Basic) e viene inizializzato con un valore calcolabile in fase di compilazione. Poiché il valore assegnato al campo di destinazione è calcolabile in fase di compilazione, modificare la dichiarazione in un campo const (Const in Visual Basic) in modo che il valore venga calcolato in fase di compilazione anziché in fase di esecuzione. |
CA1805: Non inizializzare inutilmente | Il runtime .NET inizializza tutti i campi dei tipi di riferimento sui relativi valori predefiniti prima di eseguire il costruttore. Nella maggior parte dei casi, l'inizializzazione esplicita di un campo sul valore predefinito è ridondante, che aggiunge ai costi di manutenzione e può ridurre le prestazioni, ad esempio con dimensioni di assembly aumentate. |
CA1806: Non ignorare i risultati del metodo | Viene creato un nuovo oggetto ma non viene mai usato o viene chiamato un metodo che crea e restituisce una nuova stringa e la nuova stringa non viene mai usata oppure un metodo COM (Component Object Model) o P/Invoke restituisce un codice HRESULT o un codice di errore che non viene mai usato. |
CA1810: Inizializzare i campi statici del tipo di riferimento inline | Quando un tipo dichiara un costruttore statico esplicito, tramite il compilatore JIT (Just-In-Time) viene aggiunto un controllo a ogni metodo statico del tipo e a ogni costruttore di istanza del tipo per assicurare che il costruttore statico sia stato precedentemente chiamato. I controlli dei costruttori statici possono ridurre le prestazioni. |
CA1812: Evitare classi interne prive di istanze | Un'istanza di un tipo a livello di assembly non viene creata dal codice nell'assembly. |
CA1813: Evitare attributi non sealed | .NET fornisce metodi per il recupero di attributi personalizzati. Per impostazione predefinita, questi metodi eseguono ricerche nella gerarchia di ereditarietà dell'attributo. L'utilizzo di attributi sealed elimina la ricerca nella gerarchia di ereditarietà e può migliorare le prestazioni. |
CA1814: Preferire matrici di matrici rispetto a matrici multidimensionali | Una matrice di matrici è una matrice i cui elementi sono costituiti da matrici. Le matrici che compongono gli elementi possono avere dimensioni diverse, che possono comportare una minore quantità di spazio sprecato per alcuni set di dati. |
CA1815: Eseguire l'override di Equals e dell'operatore "uguale a" sui tipi di valore | Per i tipi di valore, l'implementazione ereditata di Equals utilizza la libreria Reflection e confronta il contenuto di tutti i campi. La libreria Reflection è onerosa dal punto di vista del calcolo, inoltre il confronto di ogni campo per determinarne l'uguaglianza potrebbe essere superfluo. Se si prevede che gli utenti confrontino o ordinino le istanze oppure le utilizzino come chiavi di tabelle hash, il tipo di valore deve implementare Equals. |
CA1819: Le proprietà non devono restituire matrici | Le matrici restituite dalle proprietà non sono protette da scrittura, anche se la proprietà è di sola lettura. Affinché la matrice sia protetta da eventuali alterazioni, la proprietà deve restituire una copia della matrice. In genere, gli utenti non comprendono le implicazioni negative sulle prestazioni derivanti dalla chiamata di tale proprietà. |
CA1820: Testare le stringhe vuote usando la lunghezza di stringa | Il confronto tra stringhe mediante la proprietà String.Length o il metodo String.IsNullOrEmpty è notevolmente più veloce rispetto all'utilizzo di Equals. |
CA1821: Rimuovere i finalizzatori vuoti | Quando possibile, evitare di utilizzare i finalizzatori per non sovraccaricare ulteriormente le prestazioni durante il rilevamento della durata dell'oggetto. Un finalizzatore vuoto comporta un sovraccarico aggiuntivo senza alcun vantaggio. |
CA1822: Contrassegna i membri come statici | I membri che non accedono ai dati dell'istanza o chiamano i metodi dell'istanza possono essere contrassegnati come statici (Condivisi in Visual Basic). Tramite il compilatore verranno quindi inviati siti di chiamata non virtuali a tali membri. Si potrà così ottenere un sensibile miglioramento delle prestazioni per codici sensibili alle prestazioni. |
CA1823: Evitare campi privati non usati | Sono stati rilevati campi privati che non sembrano essere utilizzati all'interno dell'assembly. |
CA1824: Contrassegnare gli assembly con NeutralResourcesLanguageAttribute | L'attributo NeutralResourcesLanguage informa Resource Manager della lingua usata per visualizzare le risorse di impostazioni cultura neutre per un assembly. Tale approccio migliora le prestazioni delle ricerche per la prima risorsa caricata e riduce il working set. |
CA1825: Evitare allocazioni di matrici di lunghezza zero | L'inizializzazione di una matrice di lunghezza zero comporta l'allocazione di memoria non necessaria. Usare invece l'istanza di matrice vuota allocata in modo statico chiamando Array.Empty. L'allocazione di memoria viene condivisa tra tutte le chiamate di questo metodo. |
CA1826: Utilizzare la proprietà anziché il metodo Linq Enumerable | Enumerable Il metodo LINQ è stato usato in un tipo che supporta una proprietà equivalente ed efficiente. |
CA1827: Non usare Count/LongCount quando è possibile usare Any | Count o LongCount è stato usato il metodo in cui Any il metodo sarebbe più efficiente. |
CA1828: Non usare CountAsync/LongCountAsync quando è possibile usare AnyAsync | CountAsync o LongCountAsync è stato usato il metodo in cui AnyAsync il metodo sarebbe più efficiente. |
CA1829: Utilizzare la proprietà Length/Count anziché il metodo Enumerable.Count | Count Il metodo LINQ è stato usato in un tipo che supporta un oggetto equivalente, più efficiente Length o Count proprietà. |
CA1830: preferisce overload di metodo Append e Insert fortemente tipizzato in StringBuilder | Append e Insert forniscono overload per più tipi oltre System.String. Quando possibile, preferire gli overload fortemente tipizzato rispetto all'uso di ToString() e dell'overload basato su stringhe. |
CA1831: usare AsSpan anziché indicizzatori basati su intervallo per la stringa quando appropriato | Quando si usa un indicizzatore di intervallo su una stringa e si assegna in modo implicito il valore a un tipo char ReadOnlySpan<, il metodo Substring verrà usato invece di Slice, che produce una copia della parte richiesta della stringa.> |
CA1832: usare AsSpan o AsMemory anziché indicizzatori basati su range per ottenere la parte ReadOnlySpan o ReadOnlyMemory di una matrice | Quando si usa un indicizzatore di intervallo in una matrice e si assegna in modo implicito il valore a un ReadOnlySpan<T> tipo o ReadOnlyMemory<T> , il metodo GetSubArray verrà usato invece di Slice, che produce una copia della parte richiesta della matrice. |
CA1833: usare AsSpan o AsMemory invece di indicizzatori basati su intervallo per ottenere la parte Span o Memory di una matrice | Quando si usa un indicizzatore di intervallo in una matrice e si assegna in modo implicito il valore a un Span<T> tipo o Memory<T> , il metodo GetSubArray verrà usato invece di Slice, che produce una copia della parte richiesta della matrice. |
CA1834: Usare StringBuilder.Append(char) per stringhe di caratteri singoli | StringBuilder ha un Append overload che accetta come char argomento . Preferisce chiamare l'overload char per migliorare le prestazioni. |
CA1835: preferisce gli overload basati sulla memoria per 'ReadAsync' e 'WriteAsync' | 'Stream' ha un overload 'ReadAsync' che accetta un 'Memory<Byte>' come primo argomento e un overload 'WriteAsync' che accetta un byte> 'ReadOnlyMemory<' come primo argomento. Preferisce chiamare gli overload basati sulla memoria, che sono più efficienti. |
CA1836: Preferire IsEmpty se Count disponibile |
Preferisce IsEmpty una proprietà più efficiente di Count , Length Count<TSource>(IEnumerable<TSource>) o LongCount<TSource>(IEnumerable<TSource>) per determinare se l'oggetto contiene o meno elementi. |
CA1837: Usare Environment.ProcessId invece di Process.GetCurrentProcess().Id |
Environment.ProcessId è più semplice e veloce di Process.GetCurrentProcess().Id . |
CA1838: Evitare StringBuilder parametri per P/Invoke |
Il marshalling di StringBuilder crea sempre una copia del buffer nativa, generando più allocazioni per un'operazione di marshalling. |
CA1839: usare Environment.ProcessPath anziché Process.GetCurrentProcess(). MainModule.FileName | Environment.ProcessPath è più semplice e veloce di Process.GetCurrentProcess().MainModule.FileName . |
CA1840: usare Environment.CurrentManagedThreadId anziché Thread.CurrentThread.ManagedThreadId | Environment.CurrentManagedThreadId è più compatto ed efficiente di Thread.CurrentThread.ManagedThreadId . |
CA1841: Prefer Dictionary Contains methods | La chiamata Contains alla Keys raccolta o Values può spesso essere più costosa rispetto alla chiamata ContainsKey o ContainsValue al dizionario stesso. |
CA1842: Non usare 'WhenAll' con una singola attività | L'uso WhenAll di con una singola attività può comportare una perdita di prestazioni. Attendere o restituire l'attività. |
CA1843: Non usare 'WaitAll' con una singola attività | L'uso WaitAll di con una singola attività può comportare una perdita di prestazioni. Attendere o restituire l'attività. |
CA1844: fornire sostituzioni basate sulla memoria dei metodi asincroni quando si sottoclassa 'Stream' | Per migliorare le prestazioni, eseguire l'override dei metodi asincroni basati sulla memoria durante la sottoclasse di "Stream". Implementare quindi i metodi basati su matrice in termini di metodi basati sulla memoria. |
CA1845: usare la stringa basata su span. Concat' | È più efficiente usare AsSpan e string.Concat , anziché e un operatore di Substring concatenazione. |
CA1846: Preferisce AsSpan rispetto a Substring |
AsSpan è più efficiente di Substring . Substring esegue una copia stringa O(n), mentre AsSpan non ha un costo costante. AsSpan inoltre non esegue alcuna allocazione dell'heap. |
CA1847: Usare un valore letterale char per una singola ricerca di caratteri | Usare String.Contains(char) invece di String.Contains(string) quando si cerca un singolo carattere. |
CA1848: Usare i delegati LoggerMessage | Per migliorare le prestazioni, usare i LoggerMessage delegati. |
CA1849: Chiamare metodi asincroni quando si trova in un metodo asincrono | In un metodo che è già asincrono, le chiamate ad altri metodi devono essere alle versioni asincrone, dove esistono. |
CA1850: Preferisce il metodo statico HashData rispetto a ComputeHash |
È più efficiente usare il metodo statico HashData per creare e gestire un'istanza HashAlgorithm di per chiamare ComputeHash . |
CA1851: Possibili enumerazioni multiple della raccolta IEnumerable |
Possibili enumerazioni multiple di IEnumerable raccolta. Prendere in considerazione l'uso di un'implementazione che evita più enumerazioni. |
CA1852: Sigillare i tipi interni | Tipo non accessibile all'esterno dell'assembly e senza sottotipi all'interno dell'assembly contenitore non bloccato. |
CA1853: chiamata non necessaria a 'Dictionary.ContainsKey(key)' | Non c'è bisogno di proteggere Dictionary.Remove(key) con Dictionary.ContainsKey(key) . Dictionary<TKey,TValue>.Remove(TKey) controlla già se la chiave esiste e non genera un'eccezione se non esiste. |
CA1854: preferisce il metodo 'IDictionary.TryGetValue(TKey, out TValue)' | Preferisce 'TryGetValue' rispetto a un indicizzatore di dizionario sorvegliato da un controllo 'ContainsKey'. 'ContainsKey' e l'indicizzatore cercano entrambe la chiave, quindi l'uso di 'TryGetValue' evita la ricerca aggiuntiva. |
CA1855: usare span<T>. Clear() anziché Span<T>. Fill() | È più efficiente chiamare che chiamare Span<T>.Clear() Span<T>.Fill(T) per riempire gli elementi dell'intervallo con un valore predefinito. |
CA1856: Utilizzo non corretto dell'attributo ConstantExpected | L'attributo ConstantExpectedAttribute non viene applicato correttamente a un parametro. |
CA1857: Il parametro prevede una costante per ottenere prestazioni ottimali | Un argomento non valido viene passato a un parametro annotato con ConstantExpectedAttribute. |
CA1858: Usare StartsWith anziché IndexOf | È più efficiente chiamare che chiamare String.StartsWith String.IndexOf per verificare se una stringa inizia con un prefisso specificato. |
CA1859: Usare tipi concreti quando possibile per migliorare le prestazioni | Il codice usa tipi di interfaccia o tipi astratti, causando chiamate di interfaccia non necessarie o chiamate virtuali. |
CA1860: Evitare di usare il metodo di estensione 'Enumerable.Any()' | È più efficiente e più chiaro usare Length , Count o IsEmpty (se possibile) che chiamare Enumerable.Any per determinare se un tipo di raccolta contiene elementi. |
CA1861: Evitare matrici costanti come argomenti | Le matrici costanti passate come argomenti non vengono riutilizzate, il che implica un sovraccarico delle prestazioni. Per migliorare le prestazioni, è consigliabile estrarle nei campi 'static readonly'. |
CA1862: Usare gli overload del metodo 'StringComparison' per eseguire confronti di stringhe senza distinzione tra maiuscole e minuscole | Quando il codice chiama ToLower() o ToUpper() per eseguire un confronto tra stringhe senza distinzione tra maiuscole e minuscole, viene eseguita un'allocazione non necessaria. |
CA1863: Usare 'CompositeFormat' | Per ridurre i costi di formattazione, memorizzare nella cache e usare un'istanza CompositeFormat come argomento in String.Format o StringBuilder.AppendFormat . |
CA1864: preferisce il metodo 'IDictionary.TryAdd(TKey, TValue)' | Sia Dictionary<TKey,TValue>.ContainsKey(TKey) che eseguono Dictionary<TKey,TValue>.Add una ricerca, che è ridondante. È più efficiente chiamare Dictionary<TKey,TValue>.TryAdd, che restituisce un bool valore che indica se il valore è stato aggiunto o meno. TryAdd non sovrascrive il valore della chiave se la chiave è già presente. |
CA1865-CA1867: Usare l'overload char | L'overload char è un overload con prestazioni migliori per una stringa con un singolo carattere. |
CA1868: chiamata non necessaria a 'Contains' per i set | Sia ISet<T>.Add(T) che eseguono ICollection<T>.Remove(T) una ricerca, che lo rende ridondante per chiamare ICollection<T>.Contains(T) in anticipo. È più efficiente chiamare Add(T) o Remove(T) direttamente, che restituisce un valore booleano che indica se l'elemento è stato aggiunto o rimosso. |
CA1869: Memorizzare nella cache e riutilizzare le istanze di 'JsonSerializerOptions' | L'uso di un'istanza locale di JsonSerializerOptions per la serializzazione o la deserializzazione può ridurre notevolmente le prestazioni dell'applicazione se il codice viene eseguito più volte, poiché System.Text.Json memorizza internamente nella cache i metadati correlati alla serializzazione nell'istanza specificata. |
CA1870: Usare un'istanza di 'SearchValues' memorizzata nella cache | L'uso di un'istanza memorizzata nella SearchValues<T> cache è più efficiente rispetto al passaggio diretto dei valori a 'IndexOfAny' o 'ContainsAny'. |
CA1871: Non passare uno struct nullable a 'ArgumentNullException.ThrowIfNull' | 'ArgumentNullException.ThrowIfNull' accetta un 'oggetto', quindi il passaggio di uno struct nullable potrebbe causare la conversione boxing del valore. |
CA1872: preferire 'Convert.ToHexString' e 'Convert.ToHexStringLower' su catene di chiamate basate su 'BitConverter.ToString' | Usare Convert.ToHexString o Convert.ToHexStringLower quando si codificano byte in una rappresentazione di stringa esadecimale. Questi metodi sono più efficienti e descrittivi per l'allocazione rispetto all'uso BitConverter.ToString in combinazione con String.Replace per sostituire i trattini e String.ToLower. |
Collabora con noi su GitHub
L'origine di questo contenuto è disponibile in GitHub, in cui è anche possibile creare ed esaminare i problemi e le richieste pull. Per ulteriori informazioni, vedere la guida per i collaboratori.