Convenzione di denominazione C # per le costanti?


420
private const int THE_ANSWER = 42;

o

private const int theAnswer = 42;

Personalmente penso che con gli IDE moderni dovremmo andare con camelCase dato che ALL_CAPS sembra strano. Cosa ne pensi?


4
@mmiika: qual è il significato di "the" in questo esempio? È come in "The Hitchhiker's Guide to the Galaxy" o è riportato da alcuni standard di codifica C ++? (Ad esempio un vecchio framework C ++ per Macintosh, THINK C [e versioni successive, Symantec C ++], utilizzava il prefisso "its" per i membri puntatore / riferimento e "the" per i membri scalari.)
Peter Mortensen,

5
@Peter, poiché il valore della costante è 42, credo fermamente che si tratti di un riferimento a The Hitchhiker's Guide to the Galaxy .
Albireo,

@PeterMortensen È creativo! Ma nomi come itsEmployee e itsCostumer sembrano essere fuorvianti.
Camilo Martin,


Io preferisco theAnswer. In precedenza sono stato un fan della notazione ungherese, ma da quando ho imparato a non usarlo, amo evitare rigorosamente qualsiasi meta indicazione nella denominazione. Lo stesso vale per interfacce come IInterface. Io preferisco Interfacable. Ma quando lavoro in una squadra, devo rispettare le regole :(
nawfal il

Risposte:


485

La denominazione consigliata e la convenzione capitalizzazione è quello di utilizzare P Ascal C Asing per le costanti (Microsoft ha uno strumento chiamato StyleCop che documenti tutte le convenzioni privilegiate e possono controllare la vostra fonte per il rispetto - anche se è un po ' troppo anale a ritenzione per i gusti di molte persone) . per esempio

private const int TheAnswer = 42;

La convenzione di capitalizzazione Pascal è inoltre documentata nelle Linee guida per la progettazione di framework di Microsoft .


51
In realtà, StyleCop "non è un prodotto Microsoft", ma "uno strumento sviluppato da uno sviluppatore appassionato di Microsoft (la sera e nei fine settimana)". (Vedi blogs.msdn.com/sourceanalysis/archive/2008/07/20/… e blogs.msdn.com/bharry/archive/2008/07/19/… ) per i dettagli.) Detto questo, il nome del framework Microsoft convenzioni usano involucro Pascal per le costanti, per cui lo strumento è solo far rispettare lo standard che Microsoft non pubblicare e approva.
bdukes il

12
@bdukes - Non ho detto che fosse un prodotto Microsoft, tuttavia ha un sacco di utilizzo e supporto in tutta l'organizzazione (come ex dipendente, lo stavo usando anni prima che qualcuno al di fuori di Microsoft ci mettesse le mani, quindi Sono ben consapevole della sua eredità).
Greg Beech,

8
Non mi piace, perché la prima lettera viene in genere utilizzata per indicare se una variabile è visibile esternamente o meno. Nel codice, TheAnswer sembra una proprietà pubblica, non una const privata per me. Preferirei davvero scegliere un prefisso come constTheAnswer e ConstTheAnswer.
Efrain

52
Andrei con la notazione di TheAnswer tranne quando il valore è 42, nel qual caso rimarrei sicuramente con l'approccio ALL_CAPS.
Benoittr,

4
Un campo privato non dovrebbe essere racchiuso in un cammello, evento se è const?
Markus Meyer,

70

Visivamente, maiuscolo è la strada da percorrere. È così riconoscibile in quel modo. Per motivi di unicità e di non lasciare alcuna possibilità di indovinare, voto per UPPER_CASE!

const int THE_ANSWER = 42;

Nota : il maiuscolo sarà utile quando le costanti devono essere utilizzate all'interno dello stesso file nella parte superiore della pagina e per scopi di intellisense; tuttavia, se dovessero essere spostati in una classe indipendente, l'uso di Maiuscole non farebbe molta differenza, ad esempio:

public static class Constant
{
    public static readonly int Cons1 = 1;
    public static readonly int coNs2 = 2;
    public static readonly int cOns3 = 3;
    public static readonly int CONS4 = 4;
}

// Call constants from anywhere
// Since the class has a unique and recognizable name, Upper Case might lose its charm
private void DoSomething(){
var getCons1 = Constant.Cons1;
var getCons2 = Constant.coNs2;
var getCons3 = Constant.cOns3;
var getCons4 = Constant.CONS4;
 }

5
Anch'io preferisco questo in quanto l'involucro di Pascal può essere facilmente confuso con un riferimento alla proprietà.
bc3tech,

8
Indipendentemente dalle raccomandazioni di cui sopra, preferisco UPPER_CASE anche per le costanti, in quanto le rende molto più facili da identificare rispetto a tutti gli altri casi.
dub stylee,

23
@usefulBee "SNAKE_CASE" è fortemente scoraggiato in C #; Questa risposta è sbagliata Il caso corretto per i cons in C # è "TitleCase".
BrainSlugs83,

13
@ BrainSlugs83, non credo che ci sia giusto o sbagliato qui; dipende dalle preferenze e da ciò che rende il codice più chiaro.
utileBee

2
@usefulBee Accetto. Ma è comunque utile contrassegnare qual è il modo consensuale di scriverlo. Ultimamente ho fatto un sacco di codice Ruby e penso che SCREAMING_SNAKE_CASE abbia un senso: è ovvio che è qualcosa di speciale e non hai nemmeno bisogno di passare il mouse / Vai alla definizione per scoprire di cosa si tratta. Lo sai subito.
Per Lundberg,

69

In realtà lo è

private const int TheAnswer = 42;

Almeno se guardi la libreria .NET, quale IMO è il modo migliore per decidere le convenzioni di denominazione, quindi il tuo codice non sembra fuori posto.


23

Vado ancora con le maiuscole per i valori const, ma questo è più per abitudine che per qualsiasi motivo particolare.

Naturalmente è facile vedere immediatamente che qualcosa è una const. La domanda per me è: abbiamo davvero bisogno di queste informazioni? Ci aiuta in qualche modo a evitare errori? Se assegno un valore alla const, il compilatore mi dirà che ho fatto qualcosa di stupido.

La mia conclusione: vai con l'involucro del cammello. Forse cambierò anche il mio stile ;-)

Modificare:

Che qualcosa che profuma di ungherese non è in realtà un argomento valido, IMO. La domanda dovrebbe sempre essere: aiuta o fa male?

Ci sono casi in cui l'ungherese aiuta. Non così tanti al giorno d'oggi, ma esistono ancora.


30
Il codice viene letto molto più spesso di quanto sia scritto. Certo, quando scrivi il codice il compilatore ti impedirà di assegnare una costante. Ma che dire del ragazzo che deve mantenere il codice tra due anni? È bello poter riconoscere immediatamente una costante.
Greg Hewgill,

2
Gli IDE di oggi hanno molti problemi prima della compilazione. Non penso che riconoscere la costante per nome sia importante, altrimenti non dovresti aggiungere un nome speciale anche per le variabili di sola lettura?
mmiika,

5
Se ci pensate, l'habbit maiuscolo probabilmente proviene dalle macro del preprocessore piuttosto che dalle costanti (non ho mai usato i cappellini per le costanti vere). In quel contesto, ha senso distinguere le macro dal codice reale perché una macro può effettivamente essere un'espressione e non un valore costante, la sua espansione può causare effetti collaterali e così via. Quindi devi sapere quando stai usando una macro e quando stai usando una const. Sono personalmente contento di vedere il retro delle macro del preprocessore, avevano un grande potenziale per rendere il codice difficile da leggere.
Tim Long,

7
@Tim: sono d'accordo, alla fine le macro del preprocessore hanno portato più danni che benefici. La mia macro PP preferita: "#DEFINE Private Public" ;-)
Treb

1
@Tim: la libreria di tempate standard C ++ ha adottato lettere minuscole per le costanti, ad es. Std :: string :: npos ( cplusplus.com/reference/string/string/npos ). Quindi ALL_CAPS è solo per le macro e le direttive del preprocessore, il che lo rende ancora più stupido in C #.
Richard Dingwall,

16

Innanzitutto, la notazione ungherese è la pratica di utilizzare un prefisso per visualizzare il tipo di dati di un parametro o l'uso previsto. Le convenzioni di denominazione di Microsoft dicono no alla Notazione ungherese http://it.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

L'uso di MAIUSCOLO non è incoraggiato come indicato qui: Pascal Case è la convenzione accettabile e CAPPELLINI SCREAMING. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Microsoft afferma inoltre che MAIUSCOLO può essere utilizzato se viene eseguito per abbinare lo schema esistente. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

Questo lo riassume abbastanza bene.


3
Sì, la notazione ungherese non è tutto maiuscolo.
Snibbets

13

Nel suo articolo Costanti (Guida per programmatori C #) , Microsoft fornisce il seguente esempio:

class Calendar3
{
    const int months = 12;
    const int weeks = 52;
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

Quindi, per le costanti, sembra che Microsoft stia raccomandando l'uso di camelCasing. Ma nota che queste costanti sono definite localmente .

Probabilmente, la denominazione di costanti visibili esternamente è di maggiore interesse. In pratica, Microsoft documenta le sue costanti pubbliche nella libreria di classi .NET come campi . Ecco alcuni esempi:

I primi due sono esempi di PascalCasing. Il terzo sembra seguire le Convenzioni di capitalizzazione di Microsoft per un acronimo di due lettere (sebbene pi non sia un acryonym). E la quarta sembra suggerire che la regola per un acryonym di due lettere si estende ad un acronimo o identificatore di una singola lettera come E(che rappresenta la costante matematica e ).

Inoltre, nel suo documento sulle convenzioni di capitalizzazione, Microsoft afferma direttamente che gli identificatori di campo devono essere nominati tramite PascalCasinge fornisce i seguenti esempi per MessageQueue.InfiniteTimeout e UInt32.Min :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

Conclusione: utilizzare PascalCasingper costanti pubbliche (che sono documentate come constostatic readonly campi).

Infine, per quanto ne so, Microsoft non sostiene convenzioni specifiche di denominazione o capitalizzazione per identificatori privati, come mostrato negli esempi presentati nella domanda.


Lo sviluppatore che ha scritto quell'articolo chiaramente non stava seguendo le convenzioni di stile consigliate da Microsoft per C #.
BrainSlugs83,

2
L'articolo a cui punta questa risposta è cambiato. I consts ora sono pubblici e sono stati PascalCased. Dati entrambi questi cambiamenti, ciò non aiuta a rispondere se le costanti private debbano essere PascalCased o CamelCased.
Metalogic,

12

Lascia l'ungherese agli ungheresi.

Nell'esempio tralascerei persino l'articolo definitivo e vado avanti

private const int Answer = 42;

È quella risposta o è quella la risposta?

* Fatto modifica come Pascal rigorosamente corretto, tuttavia pensavo che la domanda fosse più una risposta alla vita, all'universo e tutto .


2
In questo caso specifico è la risposta. Ma solo perché adoro leggere D.Adams così tanto.
Treb,

si, ma qual è la domanda? e non darmi scusa per la scomodità;)
dove

2
Ah, ma poiché conosci già la risposta, non puoi conoscere la domanda. Si escludono a vicenda. (Scommetto che lo sapevi già ;-)
Treb,

Questa è la risposta corretta alla domanda del PO. - Ti voto due volte per aver rimosso il These potessi. :-)
BrainSlugs83

Cos'è qualcuno che è ungherese, questa risposta dice che possono usare l'altra convenzione?
Capitano Prinny,

6

In realtà tendo a preferire PascalCase qui - ma per abitudine, sono colpevole di UPPER_CASE ...


6

Credo che ALL_CAPS sia tratto dal modo di lavorare C e C ++. In questo articolo qui spiega come le differenze di stile venuto circa.

Nei nuovi IDE come Visual Studio è facile identificare i tipi, l'ambito e se sono costanti, quindi non è strettamente necessario.

Il software FxCop e Microsoft StyleCop ti aiuteranno a fornire linee guida e controllare il tuo codice in modo che tutti lavorino allo stesso modo.

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.