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é può verificarsi un evento eccezionale che impedirà l'esecuzione del finalizzatore di un oggetto, l'oggetto deve essere eliminato in modo esplicito prima che tutti i riferimenti ad esso non siano nell'ambito. |
CA2002: non bloccare gli oggetti con identità debole | Un oggetto ha un'identità debole quando è possibile accedervi direttamente attraverso i limiti del dominio applicazione. Un thread che tenta di acquisire un blocco su un oggetto con un'identità debole può essere bloccato da un secondo thread in un dominio applicazione diverso con blocco sullo stesso oggetto. |
CA2007: non attendere direttamente un'attività | Un metodo asincrono attende direttamente un Task. |
CA2008: non creare attività senza passare un TaskScheduler | Un'operazione di creazione o continuazione di attività usa un overload del metodo che non specifica un parametro TaskScheduler. |
CA2009: Non chiamare ToImmutableCollection su un valore ImmutableCollection |
ToImmutable metodo non è stato chiamato inutilmente su una raccolta non modificabile dallo spazio dei nomi System.Collections.Immutable. |
CA2011: non assegnare la proprietà all'interno del relativo 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 valori usando System.Object.ReferenceEquals, se objA e objB sono tipi valore, questi vengono boxed prima che vengano passati al metodo ReferenceEquals. Ciò significa che anche se sia objA che objB rappresentano la stessa istanza di un tipo valore, il metodo ReferenceEquals 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 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 Span<T>. |
CA2016: inoltrare il parametro CancellationToken ai metodi che accettano un | Inoltrare il parametro CancellationToken ai metodi che accettano uno per assicurarsi che le notifiche di annullamento dell'operazione vengano propagate correttamente o passare CancellationToken.None in modo esplicito per indicare intenzionalmente di non propagare il token. |
CA2017: conteggio dei parametri non corrispondente | Il numero di parametri forniti nel modello di messaggio di registrazione non corrisponde al numero di segnaposto denominati. |
CA2018: l'argomento count da Buffer.BlockCopy deve specificare 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.
byte , sbyte e le matrici di bool hanno elementi di dimensioni pari a un byte. |
CA2019: i campi di ThreadStatic non devono usare l'inizializzazione inline |
Un campo annotato con ThreadStaticAttribute viene inizializzato inline o in modo esplicito in un costruttore di static (Shared in Visual Basic). |
CA2020: impedire la modifica comportamentale causata da 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. |
CA2022: evitare la lettura inesatta con Stream.Read | Una chiamata a Stream.Read potrebbe restituire meno byte di quanto richiesto, generando codice non affidabile se il valore restituito non viene controllato. |
CA2024: non usare StreamReader.EndOfStream nei metodi asincroni | La proprietà StreamReader.EndOfStream può causare un blocco sincrono imprevisto quando nessun dato viene memorizzato nel buffer. Usare invece StreamReader.ReadLineAsync() direttamente, che restituisce null quando si raggiunge la fine del flusso. |
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.