Regole e convenzioni di denominazione degli identificatori C#

Un identificatore è il nome assegnato a un tipo (classe, interfaccia, struct, delegato o enumerazione), un membro, una variabile o uno spazio dei nomi.

Regole di denominazione

Gli identificatori validi devono seguire queste regole. Il compilatore C# genera un errore per qualsiasi identificatore che non segua queste regole:

  • Gli identificatori devono iniziare con una lettera o un carattere di sottolineatura (_).
  • Gli identificatori possono contenere caratteri alfabetici Unicode, caratteri di cifre decimali, caratteri di connettere Unicode, caratteri combinati Unicode o caratteri di formattazione Unicode. Per altre informazioni sulle categorie Unicode, vedere Unicode Category Database (Database categorie Unicode).

È possibile dichiarare gli identificatori che corrispondono a parole chiave C# usando il prefisso @ nell'identificatore. @ non fa parte del nome dell'identificatore. Ad esempio, @if dichiara un identificatore denominato if. Questi identificatori verbatim servono principalmente per garantire l'interoperabilità con gli identificatori dichiarati in altri linguaggi.

Per una definizione completa degli identificatori validi, vedere l'articolo Identificatori nelle specifiche del linguaggio C#.

Importante

La specifica del linguaggio C# consente solo la lettera (Lu, Ll, Lt, Lm, Lo o Nl), la cifra (Nd), la connessione (Pc), la combinazione di categorie (Mn o Mc) e la formattazione (Cf). Qualsiasi elemento esterno che viene sostituito automaticamente tramite _. Ciò potrebbe influire su determinati caratteri Unicode.

Convenzioni di denominazione

Oltre alle regole, le convenzioni per i nomi degli identificatori sono usate in tutte le API .NET. Queste convenzioni garantiscono la coerenza dei nomi, ma il compilatore non le applica. È possibile usare convenzioni diverse nei progetti.

Per convenzione, i programmi C# usano PascalCase per nomi di tipo, 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 di.NET:

  • I nomi di interfaccia iniziano con un carattere I maiuscolo.

  • I tipi di attributo terminano con la parola Attribute.

  • I tipi enumerazione usano un sostantivo singolare per i non flag e uno 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 la chiarezza alla brevità.

  • Usare PascalCase per i nomi della 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 per la progettazione di framework, ma è configurabile in editorconfig.

  • Evitare di usare abbreviazioni o acronimi nei nomi, ad eccezione delle abbreviazioni ampiamente note e accettate.

  • Usare spazi dei nomi significativi e descrittivi che seguono la notazione del nome di dominio inverso.

  • Scegliere i nomi di assembly che rappresentano lo scopo principale dell'assembly.

  • Evitare di usare nomi a lettera singola, ad eccezione dei contatori di cicli semplici. Inoltre, gli esempi di sintassi che descrivono la sintassi dei costrutti C# usano spesso i nomi a lettera singola seguenti, che corrispondono alla convenzione utilizzata nelle C# specifiche 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 di ref.

Suggerimento

È possibile applicare convenzioni di denominazione che riguardano maiuscole, prefissi, suffissi e separatori di parole usandoegole di denominazione in stile codice.

Negli esempi seguenti, le linee guida relative agli elementi contrassegnati public sono applicabili anche quando si utilizzano protected e gli protected internal elementi, tutti destinati a essere visibili ai chiamanti esterni.

Notazione Pascal

Usare la combinazione di maiuscole e minuscole pascal ("PascalCasing") quando si assegna un tipo di 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 combinazione di maiuscole e minuscole pascal oltre a anteporre il nome a un I. Questo prefisso indica chiaramente ai clienti consumer che si tratta di un interface.

public interface IWorkerQueue
{
}

Quando si assegnano nomi public ai membri di tipi, ad esempio campi, proprietà, eventi, usare maiuscole e minuscole pascal. Usare anche maiuscole e minuscole 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 maiuscole/minuscole pascal per i parametri, poiché 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 delle proprietà.

Camel case

Usare la combinazione di maiuscole e minuscole camel ("camelCasing") per la denominazione di campi private o internal e anteporre il prefisso _. Usare la combinazione di maiuscole e minuscole camel per la denominazione delle 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 convenzioni di denominazione in un IDE che supporta il completamento dell'istruzione, digitando _ verranno visualizzati tutti i membri con ambito oggetto.

Quando si usano i campi static che sono private o internal, utilizzare il prefisso s_ e per i thread statici usare t_.

public class DataService
{
    private static IWorkerQueue s_workerQueue;

    [ThreadStatic]
    private static TimeSpan t_timeSpan;
}

Quando si scrivono parametri del metodo, usare la combinazione di maiuscole e minuscole camel.

public T SomeMethod<T>(int someNumber, bool isValid)
{
}

Per altre informazioni sulle convenzioni di denominazione C#, vedere lo Stile di codifica del team di runtime .NET.

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 sono i segnaposto per gli argomenti di un tipo generico o di un metodo generico. Per altre informazioni sui parametri di tipo generico nella Guida per programmatori C#.

  • Assegnare nomi descrittivi ai parametri di tipo generico, a meno che un nome di una sola lettera non sia completamente comprensibile e un nome descrittivo non aggiunga valore.

    public interface ISessionChannel<TSession> { /*...*/ }
    public delegate TOutput Converter<TInput, TOutput>(TInput from);
    public class List<T> { /*...*/ }
    
  • Prendere in considerazione usando T come nome del parametro di tipo per i tipi con un parametro di tipo a lettera singola.

    public int IComparer<T>() { return 0; }
    public delegate bool Predicate<T>(T item);
    public struct Nullable<T> where T : struct { /*...*/ }
    
  • Aggiungere ai nomi di parametro di tipo descrittivi il prefisso "T".

    public interface ISessionChannel<TSession>
    {
        TSession Session { get; }
    }
    
  • Provare a indicare i vincoli applicati a un parametro di tipo nel nome del parametro. Ad esempio, un parametro vincolato a ISession potrebbe essere chiamato TSession.

La regola di analisi codice CA1715 può essere usata per garantire che i parametri di tipo vengano denominati in modo appropriato.

Convenzioni di denominazione aggiuntive

  • Gli esempi che non includono l’uso di direttive, usano le qualifiche dello spazio dei nomi. Se si è certi che uno spazio dei nomi viene importato di default in un progetto, non è necessario specificare in modo completo i nomi di tale spazio dei nomi. I nomi completi possono essere interrotti dopo un punto (.) se sono troppo lunghi per una sola riga, come mostrato nell'esempio seguente.

    var currentPerformanceCounterCategory = new System.Diagnostics.
        PerformanceCounterCategory();
    
  • Non è necessario modificare i nomi degli oggetti creati con gli strumenti di progettazione di Visual Studio per adattarli ad altre linee guida.