IMPORTANTE AGGIORNAMENTO (12 aprile 2016):
È stato portato alla nostra attenzione che lo standard interno del team .NET CoreFX insiste sull'uso della notazione di sottolineatura senza fornire alcuna spiegazione sul perché. Tuttavia, se osserviamo attentamente regola # 3 è evidente che non v'è un sistema di _, t_, s_prefissi che suggerisce perché _è stato scelto in primo luogo.
- Usiamo
_camelCaseper campi interni e privati e usiamo di sola lettura ove possibile. Prefisso campi di istanza con _, campi statici con s_e thread campi statici con t_. Se utilizzato su campi statici, readonlydovrebbe venire dopo static(cioè static readonlynon readonly static).
- Evitiamo
this.se non assolutamente necessario.
Quindi, se sei come il team .NET CoreFX che sta lavorando su un codice a livello di sistema, con prestazioni critiche, multithread, è SUGGERITO VIVAMENTE che:
- aderire ai loro standard di codifica e
- usa la notazione di sottolineatura e
- non leggere più questa risposta
Altrimenti, continua a leggere ...
LA RISPOSTA ORIGINALE:
Concordiamo innanzitutto su ciò di cui stiamo parlando. La domanda è: come accediamo ai membri dell'istanza da metodi e costruttori non statici di una classe / sottoclassi se i modificatori di visibilità lo consentono.
Underscore notazione
- suggerisce di utilizzare il prefisso "_" nei nomi dei campi privati
- dice anche che non dovresti mai usare "questo" a meno che non sia assolutamente necessario
Questa notazione
- suggerisce di usare sempre "questo". per accedere a qualsiasi membro dell'istanza
Perché esiste questa notazione?
Perché è così
- distinguere un parametro da un campo quando condividono lo stesso nome
- assicurati di lavorare nel contesto dell'istanza corrente
Esempio
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
Perché esiste la notazione di sottolineatura?
Ad alcune persone non piace digitare "this", ma hanno ancora bisogno di un modo per distinguere un campo e un parametro, quindi hanno accettato di usare "_" davanti a un campo
Esempio
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Si potrebbe pensare che sia solo una questione di gusti personali ed entrambi i modi sono ugualmente buoni / cattivi. Tuttavia ci sono alcuni aspetti in cui questa notazione batte la notazione di sottolineatura:
Chiarezza
- nomi di cluster di notazione di sottolineatura
- questa notazione mantiene intatti i nomi
Carico cognitivo
la notazione di sottolineatura è incoerente, ti fa trattare i campi in un modo speciale, ma non puoi usarli con altri membri, ogni volta che devi chiederti se hai bisogno di una proprietà o di un campo
questa notazione è coerente, non devi pensare, basta usare sempre "questo" per riferirsi a qualsiasi membro
AGGIORNAMENTO: come è stato sottolineato quanto segue non è un punto di vantaggio
Manutenzione
la notazione di sottolineatura richiede di tenere d'occhio _durante il refactoring, ad esempio trasformando un campo in proprietà (rimuovi _) o l'opposto (aggiungi _)
questa notazione non ha questo problema
Completamento automatico
Quando è necessario visualizzare l'elenco dei membri dell'istanza:
- la sottolineatura non ti aiuta molto, perché quando si digita "_" il popup di completamento automatico mostra i campi privati e tutti i tipi disponibili dagli assiemi collegati mescolati con il resto dei membri dell'istanza
- questa notazione ti dà una risposta chiara, digitando "questo" tutto ciò che vedi è l'elenco dei membri e nient'altro
Ambiguità
A volte devi gestire il codice senza l'aiuto di Intellisense. Ad esempio quando si eseguono revisioni del codice o si esplora il codice sorgente online.
la sottolineatura è ambigua: quando vedi Something.SomethingElse non puoi dire se Something è una classe e SomethingElse è la sua proprietà statica ... o forse Something è una proprietà dell'istanza corrente che ha la sua proprietà di SomethingElse
questa notazione è chiara: quando vedi Something.SomethingElse può significare solo una classe con una proprietà statica e quando vedi questo. Qualcosa.SomethingSai che sai che Something è un membro e SomethingElse è la sua proprietà
Metodi di estensione
Non è possibile utilizzare i metodi di estensione sull'istanza stessa senza utilizzare "this".
- la notazione di sottolineatura richiede che non si usi "this", tuttavia con i metodi di estensione che è necessario
- questa notazione ti salva dall'esitazione, usi sempre "questo", punto.
Supporto di Visual Studio
Raccomandazioni ufficiali
Ci sono molte linee guida ufficiali che dicono chiaramente "non usare i trattini bassi" specialmente in C #