Regole e convenzioni di denominazione degli identificatori C#
Un identificatore è il nome che viene assegnato a un tipo (classe, interfaccia, struct, delegato o enumerazione), membro, variabile o namespace.
Regole di denominazione
Gli identificatori validi devono seguire queste regole. Il compilatore C# genera un errore per qualsiasi identificatore che non segue queste regole:
- Gli identificatori devono iniziare con una lettera o un carattere di sottolineatura (
_
). - Gli identificatori possono contenere caratteri lettera Unicode, caratteri decimali, caratteri di connessione Unicode, caratteri di combinazione Unicode o caratteri di formattazione Unicode. Per altre informazioni sulle categorie Unicode, consultare il Database delle categorie Unicode.
È possibile dichiarare gli identificatori che corrispondono alle parole chiave C# usando il prefisso @
sull'identificatore. Il @
non fa parte del nome dell'identificatore. Ad esempio, @if
dichiara un identificatore denominato if
. Questi identificatori verbatim sono principalmente per l'interoperabilità con gli identificatori dichiarati in altri linguaggi.
Per una definizione completa degli identificatori validi, consultare l'articolo Identificatori nelle specifiche del linguaggio C#.
Importante
La specifica del linguaggio C# consente solo le lettere (Lu, Ll, Lt, Lm o Nl), le cifre (Nd), i connettori (Pc), i caratteri combinatori (Mn o Mc) e i caratteri di formattazione (Cf). Qualsiasi cosa al di fuori di quello è sostituita automaticamente usando _
. Ciò potrebbe influire su determinati caratteri Unicode.
Convenzioni di denominazione
Oltre alle regole, le convenzioni per i nomi degli identificatori vengono usate in tutte le API .NET. Queste convenzioni forniscono coerenza per i nomi, ma il compilatore non li applica. È possibile usare convenzioni diverse nei progetti.
Per convenzione, i programmi C# usano PascalCase
per i nomi dei tipi, gli spazi dei nomi e tutti i membri pubblici. Inoltre, il team di dotnet/docs
usa le convenzioni seguenti, adottate dallo stile di codifica del team di runtime .NET:
I nomi di interfaccia iniziano con un
I
maiuscolo.I tipi di attributo terminano con la parola
Attribute
.I tipi enum utilizzano un sostantivo singolare per gli elementi non flag e un sostantivo plurale per i flag.
Gli identificatori non devono contenere due caratteri di sottolineatura consecutivi (
_
) . Tali nomi sono riservati agli identificatori generati dal compilatore.Usare nomi significativi e descrittivi per variabili, metodi e classi.
Preferire chiarezza rispetto alla brevità.
Usare PascalCase per i nomi di classe e i nomi dei metodi.
Usare camelCase per i parametri del metodo e le variabili locali.
Usare PascalCase per i nomi costanti, sia i campi che le costanti locali.
I campi dell'istanza privata iniziano con un carattere di sottolineatura (
_
) e il testo rimanente è camelCased.I campi statici iniziano con
s_
. Questa convenzione non è il comportamento predefinito di Visual Studio, né parte delle linee guida di progettazione di Framework, ma è configurabile in editorconfig.Evitare di usare abbreviazioni o acronimi nei nomi, ad eccezione delle abbreviazioni ampiamente note e accettate.
Usare namespace significativi e descrittivi che seguono la notazione del nome di dominio inverso.
Scegliere nomi delle assembly che rappresentano il loro scopo principale.
Evitare di usare nomi costituiti da una sola lettera, ad eccezione dei contatori di cicli semplici. Inoltre, gli esempi di sintassi che descrivono la sintassi dei costrutti C# spesso usano i nomi di lettera singola seguenti che corrispondono alla convenzione usata nella specifica del linguaggio C# . Gli esempi di sintassi sono un'eccezione alla regola.
- Usare
S
per gli struct,C
per le classi. - Usare
M
per i metodi. - Usare
v
per le variabili,p
per i parametri. - Usare
r
per i parametri diref
.
- Usare
Consiglio
È possibile applicare convenzioni di denominazione che riguardano maiuscole, prefissi, suffissi e separatori di parole usando regole di denominazione in stile codice.
Negli esempi seguenti, le linee guida relative agli elementi contrassegnati public
sono applicabili anche quando si lavora con protected
e protected internal
elementi, tutti visibili ai chiamanti esterni.
Caso Pascal
Usare il PascalCasing quando si assegna un nome a un tipo class
, interface
, struct
o delegate
.
public class DataService
{
}
public record PhysicalAddress(
string Street,
string City,
string StateOrProvince,
string ZipCode);
public struct ValueCoordinate
{
}
public delegate void DelegateType(string message);
Quando si assegna un nome a un interface
, usare la convenzione PascalCase e anteporre al nome un prefisso I
. Questo prefisso indica chiaramente ai consumatori che è un interface
.
public interface IWorkerQueue
{
}
Quando si assegnano nomi public
membri di tipi, ad esempio campi, proprietà, eventi, usare maiuscole e minuscole pascal. Usare anche la notazione pascal per tutti i metodi e le funzioni locali.
public class ExampleEvents
{
// A public field, these should be used sparingly
public bool IsValid;
// An init-only property
public IWorkerQueue WorkerQueue { get; init; }
// An event
public event Action EventProcessing;
// Method
public void StartEventProcessing()
{
// Local function
static int CountQueueItems() => WorkerQueue.Count;
// ...
}
}
Quando si scrivono record posizionali, usare la notazione Pascal per i parametri: visto che sono le proprietà pubbliche del record.
public record PhysicalAddress(
string Street,
string City,
string StateOrProvince,
string ZipCode);
Per altre informazioni sui record posizionali, vedere sintassi posizionale per la definizione della proprietà.
Caso Camel
Usare la combinazione di maiuscole e minuscole "camelCasing" quando si assegnano nomi ai campi private
o internal
e si prefiggono con _
. Usare la notazione camelCase per nominare le variabili locali, incluse le istanze di un tipo delegato.
public class DataService
{
private IWorkerQueue _workerQueue;
}
Suggerimento
Quando si modifica il codice C# che segue queste norme di denominazione in un IDE che supporta il completamento del codice, digitando "_
" verranno visualizzati tutti i membri con ambito oggetto.
Quando si utilizzano campi static
che sono private
o internal
, usare il prefisso s_
e per un utilizzo statico del thread usare t_
.
public class DataService
{
private static IWorkerQueue s_workerQueue;
[ThreadStatic]
private static TimeSpan t_timeSpan;
}
Quando si scrivono i parametri del metodo, usare la notazione camel case.
public T SomeMethod<T>(int someNumber, bool isValid)
{
}
Per ulteriori informazioni sulle convenzioni di denominazione C#, consulta lo stile di codifica del team .NET Runtime.
Linee guida per la denominazione dei parametri di tipo
Le linee guida seguenti si applicano ai parametri di tipo sui parametri di tipo generico. I parametri di tipo fungono da segnaposto per gli argomenti in un tipo generico o in un metodo generico. Per ulteriori informazioni sui parametri di tipo generico, consultare la Guida alla programmazione C#.
i parametri di tipo generico Do name con nomi descrittivi, a meno che un solo nome di lettera non sia completamente esplicativo e un nome descrittivo non aggiungerà valore.
public interface ISessionChannel<TSession> { /*...*/ } public delegate TOutput Converter<TInput, TOutput>(TInput from); public class List<T> { /*...*/ }
considerare usando
T
come nome del parametro di tipo per i tipi con un solo parametro di tipo lettera.public int IComparer<T>() { return 0; } public delegate bool Predicate<T>(T item); public struct Nullable<T> where T : struct { /*...*/ }
Prepara i nomi dei parametri di tipo descrittivo con il prefisso "T".
public interface ISessionChannel<TSession> { TSession Session { get; } }
Prendere in considerazione che indica i vincoli inseriti in un parametro di tipo nel nome del parametro. Ad esempio, un parametro vincolato a
ISession
potrebbe essere chiamatoTSession
.
La regola di analisi del codice CA1715 può essere usata per assicurarsi che i parametri di tipo siano denominati in modo appropriato.
Convenzioni di denominazione aggiuntive
Esempi che non includono using direttive, usare le qualifiche dello spazio dei nomi. Se si è a conoscenza del fatto che uno spazio dei nomi viene importato automaticamente in un progetto, non è necessario qualificare completamente i nomi di tale spazio dei nomi. I nomi qualificati possono essere interrotti dopo un punto (.) se sono troppo lunghi per una singola riga, come illustrato nell'esempio seguente.
var currentPerformanceCounterCategory = new System.Diagnostics. PerformanceCounterCategory();
Non è necessario modificare i nomi degli oggetti creati usando gli strumenti di progettazione di Visual Studio per adattarli ad altre linee guida.