Regole di affidabilità

Le regole di affidabilità supportano la libreria e l'affidabilità delle applicazioni, ad esempio l'utilizzo corretto della memoria e del thread. Le regole di affidabilità includono:

Regola Descrizione
CA2000: Eliminare gli oggetti prima di perdere l'ambito Poiché è possibile che si verifichi un evento eccezionale che impedisca l'esecuzione del finalizzatore di un oggetto, è opportuno eliminare in modo esplicito l'oggetto prima che tutti i riferimenti a tale oggetto siano esterni all'ambito.
CA2002: Non bloccare oggetti con identità debole Un oggetto presenta un'identità debole quando è possibile accedere ad esso direttamente attraverso i confini dei domini applicazione. Un thread che tenta di acquisire un blocco su un oggetto con identità debole può essere bloccato da un secondo thread in un altro dominio applicazione con un blocco sullo stesso oggetto.
CA2007: Non attendere direttamente un'attività Un metodo asincrono attende direttamente un oggetto Task .
CA2008: Non creare attività senza passare un TaskScheduler Un'operazione di creazione o continuazione di un'attività usa un overload del metodo che non specifica un TaskScheduler parametro.
CA2009: Non chiamare ToImmutableCollection su un valore ImmutableCollection ToImmutable il metodo è stato chiamato inutilmente su una raccolta non modificabile dallo System.Collections.Immutable spazio dei nomi.
CA2011: Non assegnare la proprietà all'interno del setter A una proprietà è stato assegnato accidentalmente un valore all'interno della propria funzione di accesso set.
CA2012: Usare Correttamente ValueTasks I ValoriTask restituiti dalle chiamate ai membri devono essere attesi direttamente. I tentativi di utilizzare un valore ValueTask più volte o di accedere direttamente al risultato di uno prima che sia noto che venga completato possono causare un'eccezione o un danneggiamento. Ignorare tale ValueTask è probabilmente un'indicazione di un bug funzionale e può compromettere le prestazioni.
CA2013: Non usare ReferenceEquals con tipi valore Quando si confrontano i valori usando System.Object.ReferenceEquals, se objA e objB sono tipi valore, vengono inseriti nella casella prima che vengano passati al ReferenceEquals metodo . Ciò significa che anche se sia objA che objB rappresentano la stessa istanza di un tipo valore, il ReferenceEquals metodo restituisce comunque false.
CA2014: non usare stackalloc nei cicli. Lo spazio dello stack allocato da uno stackalloc viene rilasciato solo alla fine della chiamata del metodo corrente. L'uso in un ciclo può comportare una crescita dello stack non associato e condizioni di overflow dello stack finale.
CA2015: Non definire i finalizzatori per i tipi derivati da MemoryManager<T> L'aggiunta di un finalizzatore a un tipo derivato da MemoryManager<T> può consentire la liberazione della memoria mentre è ancora in uso da un oggetto Span<T>.
CA2016: inoltrare il parametro CancellationToken ai metodi che accettano uno Inoltrare il CancellationToken parametro ai metodi che accettano uno per assicurarsi che le notifiche di annullamento dell'operazione vengano propagate correttamente o passate CancellationToken.None in modo esplicito per indicare intenzionalmente di non propagare il token.
CA2017: Mancata corrispondenza del conteggio dei parametri Il numero di parametri forniti nel modello di messaggio di registrazione non corrisponde al numero di segnaposto denominati.
CA2018: count argomento da specificare Buffer.BlockCopy il numero di byte da copiare Quando si usa Buffer.BlockCopy, l'argomento count specifica il numero di byte da copiare. È consigliabile usare Array.Length solo per l'argomento count sulle matrici i cui elementi sono esattamente di un byte. byteLe matrici , sbytee bool hanno elementi di dimensioni pari a un byte.
CA2019: ThreadStatic i campi non devono usare l'inizializzazione inline Un campo con ThreadStaticAttribute annotazioni viene inizializzato inline o in modo esplicito in un static costruttore (Shared in Visual Basic).
CA2020: Impedire la modifica comportamentale causata dagli operatori predefiniti di IntPtr/UIntPtr Alcuni operatori predefiniti aggiunti in .NET 7 si comportano in modo diverso rispetto agli operatori definiti dall'utente in .NET 6 e versioni precedenti. Alcuni operatori usati per generare un contesto non controllato durante l'overflow non generano più un'eccezione a meno che non venga eseguito il wrapping all'interno del contesto selezionato. Alcuni operatori che in precedenza non generavano nel contesto controllato ora generano un'eccezione a meno che non venga eseguito il wrapping all'interno di un contesto deselezionato.
CA2021: Non chiamare Enumerable.Cast<T> o Enumerable.OfType<T> con tipi incompatibili Una chiamata a Enumerable.Cast<TResult>(IEnumerable) o Enumerable.OfType<TResult>(IEnumerable) specifica un parametro di tipo non compatibile con il tipo della raccolta di input.