Set di regole Regole estese delle linee guida di progettazione per codice gestito
Il set di regole Regole estese delle linee guida di progettazione Microsoft amplia le regole base delle linee guida di progettazione per aumentare i problemi di usabilità e manutenibilità segnalati.Particolare attenzione è rivolta alle linee guida di denominazione.È necessario considerare di includere questo set di regole se il progetto include codice di libreria o se si desidera applicare gli standard più elevati per la scrittura di codice di facile manutenibilità.
Le Regole estese delle linee guida di progettazione Microsoft includono tutte le Regole base delle linee guida di progettazione Microsoft.Le Regole base delle linee guida di progettazione Microsoft includono tutte le Regole minime consigliate Microsoft.Per ulteriori informazioni, vedere Set di regole Regole base delle linee guida di progettazione per codice gestito e Set di regole consigliate gestite per codice gestito.
Nella tabella seguente vengono descritte tutte le regole del set Regole estese delle linee guida di progettazione Microsoft.
Regola |
Descrizione |
---|---|
I tipi proprietari di campi Disposable devono essere Disposable |
|
Dichiarare correttamente i gestori eventi |
|
Contrassegnare gli assembly con AssemblyVersionAttribute |
|
I metodi di interfaccia devono essere richiamabili dai tipi figlio |
|
I tipi delle risorse native devono essere Disposable |
|
Spostare i P/Invoke nella classe NativeMethods |
|
Non nascondere i metodi di una classe base |
|
Implementare IDisposable correttamente |
|
Non generare eccezioni in posizioni non previste |
|
Evitare tasti di scelta rapida duplicati |
|
I punti di ingresso P/Invoke devono esistere |
|
I P/Invoke non devono essere visibili |
|
I tipi layout automatici non devono essere visibili a COM |
|
Chiamare GetLastError immediatamente dopo P/Invoke |
|
I tipi di base del tipo visibile a COM devono essere visibili a COM |
|
I metodi di registrazione COM devono corrispondere |
|
Dichiarare correttamente i P/Invoke |
|
Rimuovere i finalizzatori vuoti |
|
I campi dei tipi di valore devono essere portabili |
|
Le dichiarazioni P/Invoke devono essere portabili |
|
Non bloccare oggetti con identità debole |
|
Controllare l'eventuale vulnerabilità di sicurezza delle query SQL |
|
Specificare il marshalling per gli argomenti di stringa P/Invoke |
|
Controllare la sicurezza dichiarativa sui tipi di valori |
|
I puntatori non devono essere visibili |
|
I tipi protetti non devono esporre campi |
|
La sicurezza del metodo deve essere un superset del tipo |
|
I metodi APTCA devono chiamare solo metodi APTCA |
|
I tipi APTCA devono estendere solo tipi di base APTCA |
|
Non esporre in modo indiretto metodi con richieste di collegamento |
|
Le richieste di collegamento negli override devono essere identiche a quelle nei metodi di base |
|
Eseguire il wrapping delle clausole finally vulnerabili in un try esterno |
|
Per le richieste di collegamento dei tipi sono necessarie richieste di ereditarietà |
|
I tipi SecurityCritical non possono partecipare all'equivalenza del tipo |
|
I costruttori predefiniti devono essere Critical almeno come i costruttori predefiniti del tipo base |
|
Delegati devono essere associati ai metodi con trasparenza consistente |
|
I metodi devono conservare trasparenza consistente durante l'override dei metodi base |
|
I metodi Transparent devono contenere solo IL verificabile |
|
I metodi Transparent non devono chiamare i metodi con l'attributo SuppressUnmanagedCodeSecurity |
|
Il codice Transparent non deve far riferimento a elementi SecurityCritical |
|
I metodi Transparent non devono soddisfare i LinkDemand |
|
I tipi devono essere Critical almeno come le interfacce e i tipi base relativi |
|
I metodi Transparent non possono utilizzare asserzioni di sicurezza |
|
I metodi Transparent non devono effettuare chiamate nel codice nativo |
|
Eseguire il rethrow per conservare i dettagli dello stack |
|
Non eliminare oggetti più volte |
|
Inizializzare i campi statici dei tipi di valore inline |
|
Non contrassegnare componenti serviti con WebMethod |
|
I campi Disposable devono essere eliminati |
|
Non chiamare metodi sottoponibili a override nei costruttori |
|
I tipi Disposable devono dichiarare un finalizzatore |
|
I finalizzatori devono chiamare il finalizzatore della classe base |
|
Implementare costruttori di serializzazione |
|
Eseguire l'overload dell'operatore "uguale a" all'override di ValueType.Equals |
|
Contrassegnare i punti di ingresso del Windows Form con STAThread |
|
Contrassegnare tutti i campi non serializzabili |
|
Chiamare metodi della classe base su tipi ISerializable |
|
Contrassegnare i tipi ISerializable con SerializableAttribute |
|
Implementare correttamente i metodi di serializzazione |
|
Implementare ISerializable in modo corretto |
|
Fornire argomenti corretti ai metodi di formattazione |
|
Testare i valori NaN in modo corretto |
|
Non dichiarare membri statici su tipi generici |
|
Non esporre elenchi generici |
|
Utilizzare istanze di gestori eventi generici |
|
I metodi generici devono fornire parametri di tipo |
|
Evitare un uso eccessivo di parametri nei tipi generici |
|
Non annidare tipi generici nelle firme dei membri |
|
Utilizzare generics dove appropriato |
|
Gli enum devono avere valore zero |
|
Le raccolte devono implementare un'interfaccia generica |
|
Considerare il passaggio di tipi di base come parametri |
|
I tipi astratti non devono avere costruttori |
|
Eseguire l'overload dell'operatore "uguale a" all'overload degli operatori di addizione e sottrazione |
|
Contrassegnare gli assembly con CLSCompliantAttribute |
|
Contrassegnare gli assembly con ComVisibleAttribute |
|
Contrassegnare gli attributi con AttributeUsageAttribute |
|
Definire le funzioni di accesso per gli argomenti degli attributi |
|
Gli indicizzatori non devono essere multidimensionali |
|
Utilizzare proprietà dove appropriato |
|
Sostituire gli argomenti ripetitivi con una matrice di parametri |
|
Evitare l'utilizzo di parametri predefiniti |
|
Contrassegnare le enumerazioni con FlagsAttribute |
|
L'archiviazione di enum deve essere Int32 |
|
Utilizzare eventi dove appropriato |
|
Non rilevare tipi di eccezione generali |
|
Implementare costruttori di eccezioni standard |
|
I tipi annidati non devono essere visibili |
|
Le implementazioni di ICollection hanno membri fortemente tipizzati |
|
Eseguire l'override di metodi su tipi confrontabili |
|
Gli enumeratori devono essere fortemente tipizzati |
|
Gli elenchi sono fortemente tipizzati |
|
Fornire una proprietà ObsoleteAttribute.Message |
|
Utilizzare argomento di tipo stringa o integrale per gli indicizzatori |
|
Le proprietà non devono essere in sola scrittura |
|
Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento |
|
Non dichiarare membri protetti nei tipi sealed |
|
Non dichiarare membri virtuali nei tipi sealed |
|
Dichiarare i tipi negli spazi dei nomi |
|
Non dichiarare campi di istanza visibili |
|
I tipi che contengono membri statici devono essere sealed |
|
I tipi che contengono membri statici non devono avere costruttori |
|
I parametri URI non devono essere stringhe |
|
I valori restituiti URI non devono essere stringhe |
|
Le proprietà URI non devono essere stringhe |
|
Gli overload URI di stringhe chiamano gli overload System.Uri |
|
I tipi non devono estendere tipi di base specifici |
|
I membri non devono esporre tipi concreti specifici |
|
Le eccezioni devono essere pubbliche |
|
I nomi delle variabili non devono corrispondere ai nomi dei campi |
|
Evitare complessità eccessiva |
|
Gli identificatori non si devono differenziare solo in base alle maiuscole e minuscole |
|
Gli identificatori non devono corrispondere a parole chiave |
|
Rivedere i parametri inutilizzati |
|
Rimuovere locali non utilizzati |
|
Evitare un numero eccessivo di variabili locali |
|
Inizializzare i campi statici del tipo di riferimento inline |
|
Evitare codice privato che non viene richiamato |
|
Evitare classi interne prive di istanze |
|
Evitare attributi non sealed |
|
Preferire matrici di matrici rispetto a matrici multidimensionali |
|
Eseguire l'override di Equals e dell'operatore "uguale a" sui tipi di valore |
|
Le proprietà non devono restituire matrici |
|
Testare le stringhe vuote utilizzando la lunghezza di stringa |
|
Contrassegnare i membri come statici |
|
Evitare campi privati non utilizzati |
|
Non generare tipi di eccezione riservati |
|
Utilizzare equivalenti gestiti dall'API Win32 |
|
Creare istanze di eccezioni di argomento correttamente |
|
I campi non costanti non devono essere visibili |
|
Non contrassegnare le enumerazioni con FlagsAttribute |
|
Non generare eccezioni in clausole di eccezione |
|
I finalizzatori devono essere protetti |
|
Non diminuire la visibilità di membri ereditati |
|
La differenza tra membri non deve limitarsi al tipo restituito |
|
Eseguire l'override di Equals all'override dell'operatore |
|
Gli overload degli operatori hanno alternative con nome |
|
Gli operatori devono avere overload simmetrici |
|
Le proprietà di raccolta devono essere in sola lettura |
|
Utilizzare params per argomenti variabili |
|
Passare oggetti System.Uri invece di stringhe |
|
Fornire metodi di deserializzazione per i campi facoltativi |
|
Evitare l'utilizzo di spazi dei nomi con un numero ridotto di tipi |
|
Evitare parametri out |
|
Evitare l'utilizzo di interfacce vuote |
|
Non passare i tipi per riferimento |
|
Convalidare gli argomenti di metodi pubblici |
|
Evitare ereditarietà eccessiva |
|
Controllare i nomi dei campi fuorvianti |
|
Evitare codice non manutenibile |
|
Evitare un numero eccessivo di accoppiamenti di classi |
|
Non denominare 'Reserved' i valori di enumerazione |
|
Le parole composte di una stringa di risorsa devono essere digitate correttamente con distinzione tra maiuscole e minuscole |
|
Le parole composte devono essere digitate correttamente con distinzione tra maiuscole e minuscole |
|
Le stringhe di risorsa devono essere digitate correttamente |
|
Gli identificatori devono essere digitati correttamente |
|
Gli identificatori non devono contenere caratteri di sottolineatura |
|
Gli identificatori devono essere digitati correttamente con distinzione tra maiuscole e minuscole |
|
Gli identificatori devono contenere il suffisso corretto |
|
Gli identificatori non devono contenere un suffisso non corretto |
|
Non utilizzare nomi di tipo come prefisso nei valori di enumerazione |
|
Non utilizzare il prefisso Before o After negli eventi |
|
Le enumerazioni con Flags devono avere nomi plurali |
|
Gli identificatori devono contenere il prefisso corretto |
|
Solo le enumerazioni con FlagsAttribute devono avere nomi plurali |
|
I nomi dei parametri non devono corrispondere ai nomi dei membri |
|
Gli identificatori non devono contenere nomi di tipo |
|
I nomi delle proprietà non devono corrispondere ai metodi get |
|
Gli identificatori non devono contenere il prefisso non corretto |
|
I nomi dei tipi non devono corrispondere agli spazi dei nomi |
|
I nomi dei parametri devono corrispondere alla dichiarazione di base |
|
Utilizzare termini preferiti |
|
I valori letterali devono essere digitati in modo corretto |