Regole di progettazione
Le regole di progettazione supportano la conformità alle linee guida per la progettazione di .NET Framework .
In questa sezione
Regola | Descrizione |
---|---|
CA1000: non dichiarare membri statici nei tipi generici | Quando viene chiamato un membro statico di un tipo generico, è necessario specificare l'argomento di tipo per il tipo . Quando viene chiamato un membro di istanza generica che non supporta l'inferenza, è necessario specificare l'argomento di tipo per il membro. In questi due casi, la sintassi per specificare l'argomento di tipo è diversa e facilmente confusa. |
CA1001: i tipi che possiedono campi eliminabili devono essere eliminabili | Una classe dichiara e implementa un campo di istanza che è un tipo System.IDisposable e la classe non implementa IDisposable. Una classe che dichiara un campo IDisposable possiede indirettamente una risorsa non gestita e deve implementare l'interfaccia IDisposable. |
CA1002: Non esporre elenchi generici | System.Collections.Generic.List<(Of <(T>)>) è una raccolta generica progettata per le prestazioni, non per l'ereditarietà. Pertanto, List non contiene membri virtuali. Le raccolte generiche progettate per l'ereditarietà devono invece essere esposte. |
CA1003: usare istanze del gestore eventi generico | Un tipo contiene un delegato che restituisce void, la cui firma presenta due parametri (il primo è un oggetto e il secondo è un tipo assegnabile a EventArgs), e l'assembly contenitore è destinato a .NET Framework 2.0. |
CA1005: evitare parametri eccessivi nei tipi generici | Più parametri di tipo contiene un tipo generico, più difficile è sapere e ricordare cosa rappresenta ogni parametro di tipo. In genere è ovvio con un parametro di tipo, come in List<T>e in alcuni casi con due parametri di tipo, come in Dictionary<TKey, TValue>. Tuttavia, se esistono più di due parametri di tipo, la difficoltà diventa troppo grande per la maggior parte degli utenti. |
CA1008: Le enumerazioni devono avere valore zero | Il valore predefinito di un'enumerazione non inizializzata, esattamente come altri tipi di valore, è zero. Un'enumerazione con attributi non flags deve definire un membro utilizzando il valore zero in modo che il valore predefinito sia un valore valido dell'enumerazione. Se un'enumerazione con l'attributo FlagsAttribute applicato definisce un membro con valori zero, il nome deve essere "None" per indicare che nell'enumerazione non sono stati impostati valori. |
CA1010: le raccolte devono implementare un'interfaccia generica | Per ampliare l'usabilità di una raccolta, implementare una delle interfacce di raccolta generiche. È quindi possibile usare la raccolta per popolare i tipi di raccolta generici. |
CA1012: I tipi astratti non devono avere costruttori pubblici | I costruttori di tipi astratti possono essere chiamati solo dai tipi derivati. Poiché i costruttori pubblici creano istanze di un tipo e non è possibile creare istanze di un tipo astratto, un tipo astratto con un costruttore pubblico non è progettato correttamente. |
CA1014: Contrassegnare gli assembly con CLSCompliantAttribute | Common Language Specification (CLS) definisce restrizioni di denominazione, tipi di dati e regole a cui gli assembly devono essere conformi se verranno usati nei linguaggi di programmazione. Una buona progettazione determina che tutti gli assembly indicano in modo esplicito la conformità a CLS usando CLSCompliantAttribute. Se questo attributo non è presente in un assembly, l'assembly non è conforme. |
CA1016: Contrassegnare gli assembly con AssemblyVersionAttribute | .NET usa il numero di versione per identificare in modo univoco un assembly e per eseguire l'associazione ai tipi in assembly con nome sicuro. Il numero di versione viene usato insieme ai criteri di versione e editore. Per impostazione predefinita, le applicazioni vengono eseguite solo con la versione dell'assembly con cui sono state compilate. |
CA1017: Contrassegnare gli assembly con ComVisibleAttribute | ComVisibleAttribute determina il modo in cui i client COM accedono al codice gestito. Un buon design richiede che gli assembly indichino in modo esplicito la visibilità COM. La visibilità COM può essere impostata per l'intero assembly e quindi sottoposta a override per singoli tipi e membri di tipo. Se questo attributo non è presente, il contenuto dell'assembly è visibile ai client COM. |
CA1018: Contrassegnare gli attributi con AttributeUsageAttribute | Quando si definisce un attributo personalizzato, contrassegnarlo usando AttributeUsageAttribute per indicare dove è possibile applicare l'attributo personalizzato nel codice sorgente. Il significato e l'utilizzo previsto di un attributo determineranno le posizioni valide nel codice. |
CA1019: Definire le funzioni di accesso per gli argomenti degli attributi | Gli attributi possono definire argomenti obbligatori che devono essere specificati quando si applica l'attributo a una destinazione. Questi argomenti sono noti anche come argomenti posizionali perché vengono forniti ai costruttori di attributi come parametri posizionali. Per ogni argomento obbligatorio, l'attributo deve anche fornire una proprietà di sola lettura corrispondente in modo che il valore dell'argomento possa essere recuperato in fase di esecuzione. Gli attributi possono anche definire argomenti facoltativi, noti anche come argomenti denominati. Questi argomenti vengono forniti ai costruttori di attributi in base al nome e devono avere una proprietà di lettura/scrittura corrispondente. |
CA1021: evitare parametri "out" | Il passaggio di tipi per riferimento (usando out o ref) richiede esperienza con i puntatori, comprendere in che modo i tipi di valore e i tipi di riferimento differiscono, e gestire metodi con più valori di ritorno. Inoltre, la differenza tra parametri out e ref non è ampiamente riconosciuta. |
CA1024: usare le proprietà quando appropriate | Un metodo pubblico o protetto ha un nome che inizia con "Get", non accetta parametri e restituisce un valore che non è una matrice. Il metodo potrebbe essere un buon candidato per diventare una proprietà. |
CA1027: Contrassegnare le enumerazioni con FlagsAttribute | Un'enumerazione è un tipo valore che definisce un set di costanti denominate correlate. Applicare FlagsAttribute a un'enumerazione quando le costanti denominate possono essere combinate in modo significativo. |
CA1028: L'enum dovrebbe essere archiviato come Int32 | Un'enumerazione è un tipo valore che definisce un set di costanti denominate correlate. Per impostazione predefinita, il tipo di dati System.Int32 viene usato per archiviare il valore costante. Anche se è possibile modificare questo tipo sottostante, non è obbligatorio o consigliato per la maggior parte degli scenari. |
CA1030: Usate gli eventi dove appropriato | Questa regola rileva i metodi con nomi che normalmente verrebbero usati per gli eventi. Se un metodo viene chiamato in risposta a una modifica dello stato chiaramente definita, il metodo deve essere richiamato da un gestore eventi. Gli oggetti che chiamano il metodo devono generare eventi anziché chiamare direttamente il metodo . |
CA1031: Non intercettare i tipi di eccezione generali | Le eccezioni generali non devono essere rilevate. Intercettare un'eccezione più specifica o rilanciare l'eccezione generale come ultima istruzione nel blocco catch. |
CA1032: Implementare costruttori di eccezioni standard | L'impossibilità di fornire il set completo di costruttori può rendere difficile gestire correttamente le eccezioni. |
CA1033: I metodi dell'interfaccia dovrebbero essere invocabili dai tipi derivati | Un tipo visibile esternamente non sigillato fornisce un'implementazione esplicita del metodo di un'interfaccia pubblica e non fornisce un metodo alternativo visibile esternamente con il medesimo nome. |
CA1034: i tipi annidati non devono essere visibili | Un tipo annidato è un tipo dichiarato nell'ambito di un altro tipo. I tipi annidati sono utili per incapsulare dettagli privati dell'implementazione del tipo contenitore. Per questo scopo, i tipi annidati non devono essere visibili esternamente. |
CA1036: Sovrascrivere i metodi su tipi confrontabili | Un tipo pubblico o protetto implementa l'interfaccia System.IComparable. Non esegue l'override di Object.Equals né esegue l'overload dell'operatore specifico del linguaggio per l'uguaglianza, la disuguaglianza, minore o maggiore di. |
CA1040: evitare interfacce vuote | Le interfacce definiscono i membri che forniscono un comportamento o un contratto di utilizzo. Le funzionalità descritte dall'interfaccia possono essere adottate da qualsiasi tipo, indipendentemente dalla posizione in cui il tipo viene visualizzato nella gerarchia di ereditarietà. Un tipo implementa un'interfaccia fornendo implementazioni per i membri dell'interfaccia. Un'interfaccia vuota non definisce alcun membro; pertanto, non definisce un contratto che può essere implementato. |
CA1041: Fornire il messaggio ObsoleteAttribute | Un tipo o un membro viene contrassegnato tramite un attributo System.ObsoleteAttribute che non dispone della proprietà ObsoleteAttribute.Message specificata. Quando viene compilato un tipo o un membro contrassegnato tramite ObsoleteAttribute, viene visualizzata la proprietà Message dell'attributo , che fornisce all'utente informazioni sul tipo o sul membro obsoleto. |
CA1043: Utilizzare un argomento intero o una stringa per gli indicizzatori | Gli indicizzatori ,ovvero le proprietà indicizzate, devono usare tipi integrali o stringa per l'indice. Questi tipi vengono in genere usati per l'indicizzazione di strutture di dati e aumentano l'usabilità della libreria. L'uso del tipo Object deve essere limitato a tali casi in cui non è possibile specificare il tipo integrale o stringa specifico in fase di progettazione. |
CA1044: Le proprietà non devono essere scritte solo | Sebbene sia accettabile e spesso necessario avere una proprietà di sola lettura, le linee guida di progettazione impediscono l'uso di proprietà di sola scrittura. Ciò è dovuto al fatto che consentire a un utente di impostare un valore e quindi impedire all'utente di visualizzare tale valore, non fornisce alcuna sicurezza. Inoltre, senza accesso in lettura, non è possibile visualizzare lo stato degli oggetti condivisi, che ne limita l'utilità. |
CA1045: Non passare tipi per riferimento | Il passaggio di tipi per riferimento (usando out o ref) richiede esperienza con i puntatori, comprendere in che modo i tipi di valore e i tipi di riferimento differiscono e gestire i metodi con più valori restituiti. Gli architetti della libreria che progettano per un pubblico generale non devono aspettarsi che gli utenti diventino esperti nell'uso di parametri out o ref. |
CA1046: non eseguire l'overload dell'operatore uguale ai tipi di riferimento | Per i tipi di riferimento, l'implementazione predefinita dell'operatore di uguaglianza è quasi sempre corretta. Per impostazione predefinita, due riferimenti sono uguali solo se puntano allo stesso oggetto. |
CA1047: non dichiarare membri protetti nei tipi sigillati | I tipi dichiarano membri protetti in modo che i tipi derivati possano accedere o eseguire l'override del membro. Per definizione, i tipi sigillati non possono essere ereditati, il che significa che i metodi protetti su tipi sigillati non possono essere chiamati. |
CA1050: Dichiarare i tipi nei namespace | I tipi vengono dichiarati negli spazi dei nomi per evitare conflitti di nomi e come modo per organizzare i tipi correlati in una gerarchia di oggetti. |
CA1051: non dichiarare campi di istanza visibili | L'uso primario di un campo dovrebbe essere come dettaglio di implementazione. I campi devono essere privati o interni e devono essere esposti tramite le proprietà. |
CA1052: i tipi di supporto statici devono essere sigillati | Un tipo pubblico o protetto contiene solo membri statici e non viene dichiarato utilizzando il modificatore sealed (C#) o NotInheritable (Visual Basic). Un tipo che non deve essere ereditato deve essere indicato con il modificatore sealed per impedirne l'uso come tipo di base. |
CA1053: i tipi di contenitori statici non devono avere costruttori | Un tipo pubblico pubblico o annidato dichiara solo membri statici e dispone di un costruttore predefinito pubblico o protetto. Il costruttore non è necessario perché la chiamata di membri statici non richiede un'istanza del tipo. L'overload della stringa dovrebbe chiamare l'overload URI (Uniform Resource Identifier) utilizzando l'argomento stringa per sicurezza. |
CA1054: i parametri URI non devono essere stringhe | Se un metodo accetta una rappresentazione di stringa di un URI, deve essere fornito un overload corrispondente che accetta un'istanza della classe URI, che fornisce questi servizi in modo sicuro e sicuro. |
CA1055: i valori restituiti URI non devono essere stringhe | Questa regola presuppone che il metodo restituisca un URI. Una rappresentazione di stringa di un URI è soggetta all'analisi e alla codifica degli errori e può causare vulnerabilità di sicurezza. La classe System.Uri fornisce questi servizi in modo sicuro e sicuro. |
CA1056: le proprietà URI non devono essere stringhe | Questa regola presuppone che la proprietà rappresenti un URI. Una rappresentazione di stringa di un URI è soggetta all'analisi e alla codifica degli errori e può causare vulnerabilità di sicurezza. La classe System.Uri fornisce questi servizi in modo sicuro e sicuro. |
CA1058: I tipi non devono estendere determinati tipi di base | Un tipo visibile esternamente estende determinati tipi di base. Usare una delle alternative. |
CA1060: Spostare P/Invoke nella classe NativeMethods | Metodi di chiamata della piattaforma, ad esempio quelli contrassegnati con il System.Runtime.InteropServices.DllImportAttribute o i metodi definiti usando la parola chiave Declare in Visual Basic, accedere al codice non gestito. Questi metodi devono essere della classe NativeMethods, SafeNativeMethods o UnsafeNativeMethods. |
CA1061: non nascondere i metodi della classe base | Un metodo in un tipo di base è nascosto da un metodo denominato in modo identico in un tipo derivato, quando la firma del parametro del metodo derivato differisce solo per i tipi derivati più deboli rispetto ai tipi corrispondenti nella firma del parametro del metodo di base. |
CA1062: Convalidare gli argomenti dei metodi pubblici | Tutti gli argomenti di riferimento passati a metodi visibili esternamente devono essere controllati in base a Null. |
CA1063: Implementare correttamente IDisposable | Tutti i tipi IDisposable devono implementare correttamente il modello Dispose. |
CA1064: le eccezioni devono essere pubbliche | Un'eccezione interna è visibile solo all'interno del proprio ambito interno. Dopo che l'eccezione non rientra nell'ambito interno, è possibile usare solo l'eccezione di base per intercettare l'eccezione. Se l'eccezione interna viene ereditata da System.Exception, System.SystemExceptiono System.ApplicationException, il codice esterno non avrà informazioni sufficienti per sapere cosa fare con l'eccezione. |
CA1065: non generare eccezioni in posizioni impreviste | Un metodo che non deve generare eccezioni genera un'eccezione. |
CA1066: Implementare IEquatable quando si esegue l'override di Equals | Un tipo di dato valore sovrascrive il metodo Equals, ma non implementa IEquatable<T>. |
CA1067: Eseguire l'override di Equals durante l'implementazione di IEquatable | Un tipo implementa IEquatable<T>, ma non esegue l'override del metodo Equals. |
CA1068: i parametri CancellationToken devono essere inseriti per ultimi | Un metodo ha un parametro CancellationToken che non è l'ultimo parametro. |
CA1069: Le enumerazioni non devono contenere valori duplicati | Un'enumerazione ha più membri a cui viene assegnato in modo esplicito lo stesso valore costante. |
CA1070: non dichiarare eventi di campo come virtuali | Un evento simile a un campo è stato dichiarato virtuale. |
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.