Come si nominano le variabili private in C #? [chiuso]


25

Qual è la migliore pratica, le convenzioni di denominazione più comunemente accettate per le variabili private in C #?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Misteriosa altra opzione

Quale usi e perché? (La mia azienda è abbastanza nuova in C # e vorrei scegliere il metodo più "accettato dal settore" per provare ad entrare nel nostro standard di codifica.)


Perché non utilizzare le proprietà implementate automaticamente? msdn.microsoft.com/en-us/library/bb384054.aspx
Kyle Ballard

1
C # ha standard per questo, vedere stackoverflow.com/questions/14967/...
Tamara Wijsman

7
Non è bello parlare di variabili private in pubblico. Scusa, ho dovuto.
Marco C

Uso lo stesso di azheglov (m_someVariable) con l'eccezione di utilizzare solo _someVariable nell'ambito locale di un metodo.
lord-fu,

7
@Mark Penso che dovrebbe essere "membri privati" per essere suggestivo.
Epsilon,

Risposte:


44

Le linee guida per la progettazione della classe MSDN http://msdn.microsoft.com/en-us/library/ta31s3bc.aspx consiglia l'opzione 1 - myInteger.

Ho sempre usato questo stile. Non mi piace il personaggio _.


1
Non ho apprezzato il carattere _ fino a quando il resharper non ha aggiunto la corrispondenza della stringa media all'intelligenza. Ora posso digitare myIntegere si abbinerà _myInteger. Ma non sapevo che MSDS
dicesse

4
Se usi l'opzione 1, come posso sapere se myIntegeruna variabile è locale in un metodo o un membro di classe privato?
Wizard79,

4
@Lorenzo this.myInteger;)
TWith2Sugars

12
Ma ... "questo" è composto da 4 caratteri e "_" è solo uno! In realtà, quella linea guida ha molto senso, ma nel mio ufficio tutti amano la sottolineatura e odiano vedere "this.Foo", per qualsiasi motivo. A volte le uniche linee guida che contano sono quelle che il tuo posto di lavoro ti impone.
CodexArcanum,

2
L'argomento sul numero di caratteri è discutibile. Non è necessario digitare thisogni volta, solo nei metodi in cui è presente una variabile locale con lo stesso nome. Tuttavia, è necessario scrivere un simbolo aggiuntivo ogni volta che si utilizza un carattere di sottolineatura. Con quello che sono d'accordo è che attenersi al tuo accordo di stile di codice locale è sempre importante.
Malcolm,

25

Uso l'opzione n. 4 sopra:

private int _myInteger;

Mi piace avere qualche indicazione di scopo nei nomi delle mie variabili e il carattere di sottolineatura è sufficiente a tale scopo. È anche abbastanza facile da leggere.


5
Non sono d'accordo sul fatto che sia facile da leggere, soprattutto se devi operare con diverse variabili.
Restuta,

15

Uso il seguente schema di denominazione:

  • 1st (myInteger) per variabili con ambito locale
  • 2nd (MyInteger) per proprietà pubbliche
  • 4th (_myInteger) per variabili private

14

Penso che l'opzione 4 sia davvero l'opzione più leggibile. Ti aiuta a dover fare questo:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

Rende inoltre più evidenti tutti i membri privati. Nel seguente esempio, da dove viene age? Senza il thisqualificatore è più difficile da dire.

private void Method()
{
    var x = 2;
    var y = age + x;
}

Questo è molto più facile da capire:

private void Method()
{
    var x = 2;
    var y = _age + x;
}

1
Ho giurato per il tuo primo esempio, ma dopo aver provato l'opzione # 4 per un po 'preferisco di gran lunga usare il trattino basso come prefisso per i campi privati.
Jeremy Wiebe,

2
Dico, usa 1 per le variabili private, usa 4 per le variabili private utilizzate nelle proprietà.
Evan Plaice,

2
Non sono d'accordo con ChaosPandoin. Per me, entrambe le implementazioni di Method () sono facili da leggere. Non appena vedo la variabile age (o _age) e noto che non è dichiarata nel metodo, mi rendo conto che deve essere dichiarata altrove nella classe. Questo qualificatore è terribile ma almeno è limitato al metodo del costruttore.
David Kennedy,

10

Prima di tutto, PascalCasing è comunemente riservato per proprietà pubbliche, contro, metodi, ecc. Della classe. Quindi salterei 2 e 5.

In secondo luogo, la notazione ungherese è scoraggiata nel mondo .NET, quindi (penso,) 3 è uscito. Supponendo che sia quello che sta succedendo con 3.

Ciò lascia CamelCasing e _camelCasing. In genere uso _camelCasing per le variabili di classe e semplicemente il vecchio camelCasing per variabili nell'ambito di un metodo o più ristretto. L'intelaiatura del cammello è lo standard accettato utilizzato per argomenti di metodo, nomi di variabili protetti / privati ​​e variabili all'interno di un metodo o ambito più ristretto.

Mi piace anche anteporre al carattere di sottolineatura in modo che le mie variabili private siano raggruppate nel mio intellisenso. Tuttavia, lo faccio solo per variabili con ambito in un tipo. Le variabili dichiarate in un metodo o in un ambito più ristretto lascio il carattere di sottolineatura disattivato. Rende facile separarli e tenere insieme le variabili meno utilizzate.


2
Non capisco perché dovresti usare _camelCasing per le variabili di classe, poiché di solito è ovvio che si tratta di variabili di classe.
alternativa dal

1
@math no, non è ovvio nell'intellisense. Ricorda, i campi (variabili con ambito di classe) hanno (quasi) la stessa icona delle variabili con ambito di metodo, quindi sembrano esattamente uguali se non guardi da vicino. Il carattere di sottolineatura aiuta a differenziarli visivamente e li tiene raggruppati insieme, il che aiuta se non li usi spesso (cosa che non dovresti essere poiché lo stato è nemico della programmazione senza bug).
Strappato il

Non ho mai detto nulla sull'Intellisense. Sto parlando della differenza tra Color.ClassMethod () e myColor.InstanceMethod (), vale a dire che dovrebbe essere ovvio che poiché Color è una classe, ClassMethod () è un metodo di classe.
alternativa

@Math you before: I don't understand why you would use _camelCasing for class variables you after: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()Mi scusi mentre sono confuso. Ascolta, uso raramente le variabili di classe, quindi è bello ricordare i loro nomi colpendo _ e facendoli apparire nell'intellisense bello e raggruppati.
Strappato il

2
@mathepic: Quando Will dice "variabili di classe" significa campi di istanza (privati). Sembra che tu abbia interpretato ciò che ha detto significare membri statici; ma non è quello che ha detto.
Dan Tao,

4

private int integer

Se si confondono tra le variabili membro e locali in un ambito del metodo, probabilmente è necessario eseguire il refactoring.


+1: questo è quello che credo sia il punto. A proposito: vedo la sua fonte, ma il nome integerpotrebbe essere riformulato meglio, forse value?
Lupo,

2

Credo che il modo migliore per farlo (in C # /. Net comunque) sia una combinazione di 2 e 6:

private int MyInteger { get; set; }

Non c'è teoricamente nessuna variabile qui, ma sembra e si comporta come una variabile di istanza privata. Se dobbiamo aggiungere una logica di business a quel valore (è un valore completamente interno, quindi possiamo fare tutto ciò che vogliamo dopo tutto), allora è già "proprietà" per noi. Una calda tazza fumante di vittoria!


2

Faccio l'opzione n. 4 perché è così che SSCLI assomiglia, ma sinceramente non mi interessa molto la denominazione della variabile privata. Il pubblico è una storia diversa.

A proposito, hai dimenticato m_MyInteger


2

Non lo definirei "mio" per niente!

Ma direi

class C
{
     int VariableName { get; set; }
}

abbastanza spesso questo è più bello che avere variabili esplicite. Se avessi una variabile privata esplicita la chiamereiint _variableName;


1

In C ++ tendo a usare _ poiché cambio molto editor, il che non mi permette di vedere se è privato.

Per C # tendo a lasciare _ _ visto che Visual Studio mi permette di vedere se è privato.

Tendo ad usare il modo Camel Case per farlo.


1

Uso 4 ( private int _myInteger;) perché:

private int myInteger;

Questo è il modo in cui denomino le mie variabili locali.

private int MyInteger;

È così che chiamo costanti.

private int mMyInteger;

Questo non è in stile C #.

private int _MyInteger;

Sembra strano.


1

con il trattino basso.

Bill Wagner spiega perché in C # efficace . Ma non avrei mai nominare un intero il mio intero , meglio qualcosa come _age o _length. Includere TypeName nel nome dell'istanza è una pratica orribile. I nomi devono essere autoesplicativi e poiché C # è di tipo sicuro, è possibile trovarli sempre.


1
Sì, è stato un esempio però.
Vaccano,

1

Devi fare un esempio più specifico, ma:

private int count, private int badFileCount,private static readonly int ReconnectAttemptsLimit

A proposito, ottieni tutto questo GRATIS quando installi e inizi a utilizzare l'ultima e la migliore MSFT Stylecop.


0

Vado dall'opzione 5: private int _MyFoo

Tuttavia, non vedo alcun vantaggio competitivo reale rispetto a _myFoo.


0

Usa camelCasing per variabili private come myInteger

Considerare un precedente _se la variabile è un backup per una proprietà per ridurre le confusioni -
Variabile _myPropertyper la proprietàMyProperty


0

Ho un nome ReSharper per le mie variabili, non solo per le mie ma anche per tutti gli altri. C'è molta consistenza nel progetto.


0

Lo standard di codifica C # IDesign di Juval Lowy è piuttosto popolare. Questo standard consiglia di aggiungere il prefisso alle variabili dei membri privati ​​con "m_" (Opzione 6). Questo è ciò che facciamo nel nostro team.

private int m_myInteger;

L'opzione 4 ( _myInteger) è una variazione accettabile di questo standard.

Non mi è piaciuta la raccomandazione MSDN ( myInteger), perché rende difficile distinguere un membro privato da una variabile locale. La loro raccomandazione, ovviamente, risolve questo problema qualificando i membri privati ​​con this, che mi sembra ridondante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.