Convenção de nomenclatura em C # para constantes?

419
private const int THE_ANSWER = 42;

ou

private const int theAnswer = 42;

Pessoalmente, acho que, com os IDEs modernos, devemos usar o camelCase, pois ALL_CAPS parece estranho. O que você acha?

mmiika
fonte
4
@mmiika: qual é o significado "the" neste exemplo? É como em "O Guia do Mochileiro das Galáxias" ou é herdado de algum padrão de codificação C ++? (Por exemplo, um quadro de idade C ++ para Macintosh, PENSO C [e, mais tarde, a Symantec C ++], prefixo usado "seu" para os membros de ponteiro / referência e "a" para os membros escalares.)
Peter Mortensen
5
@ Peter, já que o valor da constante é 42, acredito firmemente que é uma referência ao Guia do Mochileiro das Galáxias .
Albireo
@PeterMortensen Isso é criativo! Mas nomes como itsEmployee e itsCostumer parecem enganadores.
Camilo Martin
4
MSDN: Convenções de capitalização msdn.microsoft.com/en-us/library/vstudio/ms229043(v=vs.90).aspx
Captain Sensible
Eu prefiro theAnswer. Anteriormente era um fã de notação húngaro, mas desde que aprendi a não usá-lo, adoro evitar estritamente qualquer meta indicação na nomeação. O mesmo vale para interfaces como IInterface. Eu prefiro Interfacable. Mas quando se trabalha em uma equipe, eu tenho que cumprir as regras :(
Nawfal

Respostas:

484

A nomeação recomendado e convenção capitalização é usar P Ascal C asing para constantes (Microsoft tem uma ferramenta chamada StyleCop que documenta todas as convenções preferenciais e pode verificar a sua fonte para o cumprimento - embora seja um pouco demais anal retentiva para o gosto de muitas pessoas) . por exemplo

private const int TheAnswer = 42;

A convenção de capitalização de Pascal também está documentada nas Diretrizes de Design da Estrutura da Microsoft .

Greg Beech
fonte
51
Na verdade, o StyleCop "não é um produto da Microsoft", mas "uma ferramenta desenvolvida por um desenvolvedor muito apaixonado da Microsoft (à noite e nos fins de semana)". (Consulte blogs.msdn.com/sourceanalysis/archive/2008/07/20/… e blogs.msdn.com/bharry/archive/2008/07/19/… ) para obter detalhes.) Dito isto, a nomenclatura da estrutura da Microsoft convenções usar caixa Pascal para constantes, por isso, a ferramenta é apenas aplicar o padrão que a Microsoft não publicar e apoiar.
bdukes
12
@bdukes - Eu não disse que era um produto da Microsoft, mas tem bastante uso e suporte em toda a organização (como ex-funcionário, eu o usava anos antes de alguém de fora da Microsoft colocar as mãos nele, então Estou bem ciente de sua herança).
Greg Beech /
8
Não gosto disso, porque a primeira letra é normalmente usada para indicar se uma variável é visível externamente ou não. No código, TheAnswer parece uma propriedade pública, não uma const particular para mim. Na verdade, eu preferiria usar um prefixo como constTheAnswer e ConstTheAnswer.
Efrain
52
Eu iria com a notação TheAnswer, exceto quando o valor for 42, nesse caso, eu definitivamente ficaria com a abordagem ALL_CAPS.
Benoittr
4
Um campo privado não deve ser revestido de camelo, caso seja const?
Markus Meyer
70

Visualmente, Maiúsculas é o caminho a percorrer. É tão reconhecível assim. Por uma questão de exclusividade e sem chance de adivinhar, voto em UPPER_CASE!

const int THE_ANSWER = 42;

Nota : A maiúscula será útil quando as constantes forem usadas dentro do mesmo arquivo na parte superior da página e para fins de inteligência; no entanto, se eles fossem movidos para uma classe independente, o uso de Maiúsculas não faria muita diferença, como um exemplo:

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;
 }
usefulBee
fonte
5
Eu também prefiro isso, pois o invólucro de Pascal pode ser facilmente confundido com uma referência de propriedade.
bc3tech
8
Independentemente das recomendações acima, eu também prefiro o UPPER_CASE para constantes, pois as torna muito mais fáceis de identificar em comparação com qualquer um dos outros casos.
dub stylee
23
@usefulBee "SNAKE_CASE" é fortemente desencorajado em C #; Esta resposta está errada. O caso correto para consts em C # é "TitleCase".
BrainSlugs83
13
@ BrainSlugs83, não acho que haja certo ou errado aqui; tudo se resume à preferência e ao que torna o código mais claro.
usefulBee
2
@usefulBee Concordo. Mas ainda é bom marcar qual é a maneira consensual de escrevê-lo. Ultimamente, tenho feito muito código Ruby e acho que o SCREAMING_SNAKE_CASE faz sentido: é muito óbvio que é algo especial, e você nem precisa passar o mouse / Ir para a definição para descobrir do que se trata. Você sabe disso imediatamente.
Per Lundberg
69

Na verdade, é

private const int TheAnswer = 42;

Pelo menos, se você olhar para a biblioteca .NET, qual IMO é a melhor maneira de decidir as convenções de nomenclatura - para que seu código não pareça deslocado.

bh213
fonte
23

Eu ainda uso maiúsculas para valores const, mas isso é mais por hábito do que por qualquer motivo específico.

É claro que facilita ver imediatamente que algo é uma const. A pergunta para mim é: realmente precisamos dessa informação? Isso nos ajuda de alguma maneira a evitar erros? Se eu atribuir um valor à const, o compilador me dirá que fiz algo estúpido.

Minha conclusão: Vá com a carcaça de camelo. Talvez eu mude meu estilo também ;-)

Editar:

Que algo cheira a húngaro não é realmente um argumento válido, IMO. A pergunta deve sempre ser: Ajuda ou dói?

Há casos em que o húngaro ajuda. Não há muitos hoje em dia, mas eles ainda existem.

Treb
fonte
30
O código é lido com muito mais frequência do que está escrito. Claro, quando você está escrevendo o código, o compilador impedirá que você atribua uma constante. Mas e o cara que precisa manter seu código daqui a dois anos? É certamente bom poder reconhecer uma constante imediatamente.
Greg Hewgill
2
Os IDEs de hoje enfrentam muitos problemas antes da compilação. Não acho importante reconhecer constante pelo nome, caso contrário, você também não deve adicionar um nome especial para variáveis ​​somente leitura?
28220 mmiika
5
Se você pensar bem, o habbit maiúsculo provavelmente veio das macros do pré-processador, e não das constantes (nunca usei maiúsculas de bloco para constantes verdadeiras). Nesse contexto, faz sentido distinguir as macros do código real porque uma macro pode realmente ser uma expressão e não um valor constante, sua expansão pode causar efeitos colaterais e assim por diante. Então, você precisa saber quando está usando uma macro e quando está usando uma const. Pessoalmente, fico feliz em ver a parte de trás das macros do pré-processador, pois elas têm muito potencial para dificultar a leitura do código.
9132 Tim Long
7
@ Tim: Concordo, no final, as macros do pré-processador trouxeram mais mal do que bem. Minha macro PP mais favorita: "#DEFINE Private Public" ;-)
Treb
1
@ Tim: a Biblioteca Tempate Padrão do C ++ adotou letras minúsculas para constantes, por exemplo, std :: string :: npos ( cplusplus.com/reference/string/string/npos ). Portanto, ALL_CAPS é apenas para diretivas de macros e pré-processador - o que faz com que pareça ainda mais estúpido em C #.
Richard Dingwall
16

Primeiro, a notação húngara é a prática de usar um prefixo para exibir o tipo de dados de um parâmetro ou o uso pretendido. As convenções de nomenclatura da Microsoft dizem não à notação húngara http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

O uso de MAIÚSCULAS não é incentivado como indicado aqui: Pascal Case é a convenção aceitável e SCREAMING CAPS. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

A Microsoft também afirma aqui que UPPERCASE pode ser usado se for feito para corresponder ao esquema existente. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

Isto resume bem.

user31939
fonte
3
Sim, a notação húngara nem sempre é maiúscula.
snibbets
13

Em seu artigo Constantes (Guia de Programação em C #) , a Microsoft fornece o seguinte exemplo:

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;
}

Portanto, para constantes, parece que a Microsoft está recomendando o uso de camelCasing. Mas observe que essas constantes são definidas localmente .

Indiscutivelmente, o nome de constantes visíveis externamente é de maior interesse. Na prática, a Microsoft documenta suas constantes públicas na biblioteca de classes .NET como campos . aqui estão alguns exemplos:

Os dois primeiros são exemplos de PascalCasing. O terceiro parece seguir as Convenções de Capitalização da Microsoft para um acrônimo de duas letras (embora pi não seja um acrônimo). E a quarta parece sugerir que a regra para um acrônimo de duas letras se estende a um único acrônimo ou identificador de letra como E(que representa a constante matemática e ).

Além disso, em seu documento de convenções de capitalização, a Microsoft afirma diretamente que os identificadores de campo devem ser nomeados via PascalCasinge fornece os seguintes exemplos para MessageQueue.InfiniteTimeout e UInt32.Min :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

Conclusão: use PascalCasingpara constantes públicas (documentadas como constou static readonlycampos).

Por fim, até onde eu sei, a Microsoft não defende convenções específicas de nomeação ou uso de maiúsculas para identificadores particulares, como mostra os exemplos apresentados na pergunta.

DavidRR
fonte
O desenvolvedor que escreveu esse artigo claramente não estava seguindo as convenções de estilo recomendadas pela Microsoft para C #.
BrainSlugs83
2
O artigo apontado por esta resposta foi alterado. Os consts agora são públicos e foram PascalCased. Dadas essas duas mudanças, isso não ajuda a responder se as constantes privadas devem ser PascalCased ou camelCased.
Metalogic
12

Deixe o húngaro para os húngaros.

No exemplo, eu até deixaria de fora o artigo definitivo e apenas iria com

private const int Answer = 42;

Essa é a resposta ou é a resposta?

* Feito como editar Pascal estritamente correto, no entanto, eu estava pensando que a pergunta estava buscando mais uma resposta para a vida, o universo e tudo .

pomba
fonte
2
Nesse caso específico, é a resposta. Mas só porque eu amo muito ler D.Adams.
308 Treb
sim, mas qual é a questão? e não me desculpe pela linha de inconveniência;)
dove
2
Ah, mas como você já sabe a resposta, não pode saber a pergunta. Eles são mutuamente exclusivos. (Aposto que você já sabia disso ;-)
Treb 28/10/08
Esta é a resposta correta para a pergunta do OP. - Eu te voto duas vezes por remover o Theque eu pudesse. :-)
BrainSlugs83
O que alguém é húngaro? Esta resposta diz que eles podem usar a outra convenção?
Capitão Prinny
6

Na verdade, tendem a preferir o PascalCase aqui - mas, por hábito, sou culpado de UPPER_CASE ...

Marc Gravell
fonte
6

O ALL_CAPS é retirado da maneira de trabalhar em C e C ++, acredito. Este artigo aqui explica como surgiram as diferenças de estilo.

Nos novos IDEs, como o Visual Studio, é fácil identificar os tipos, escopo e se eles são constantes, de modo que não é estritamente necessário.

O software FxCop e Microsoft StyleCop ajudará a fornecer diretrizes e a verificar seu código para que todos trabalhem da mesma maneira.

John
fonte