Como você nomeia suas variáveis ​​privadas em C #? [fechadas]


25

Qual é a melhor prática, convenções de nomenclatura mais comumente aceitas para variáveis ​​privadas em C #?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Outra opção misteriosa

Qual você usa e por quê? (Minha empresa é relativamente nova em C # e gostaria de escolher o método mais "aceito pelo setor" para tentar acessar nosso padrão de codificação.)


Por que não usar propriedades implementadas automaticamente? msdn.microsoft.com/en-us/library/bb384054.aspx
Kyle Ballard

1
C # tem padrões para isso, consulte stackoverflow.com/questions/14967/...
Tamara Wijsman

7
Não é legal falar sobre variáveis ​​privadas em público. Desculpe, só precisava.
Mark C

Eu uso o mesmo que azheglov (m_someVariable), com exceção de eu só uso _someVariable no escopo local de um método.
Lord-fu #

7
@ Mark Eu acho que deveria ser "membros privados" para que isso seja sugestivo.
EpsilonVector

Respostas:


44

As diretrizes de design da classe MSDN http://msdn.microsoft.com/en-us/library/ta31s3bc.aspx recomendam a opção 1 - myInteger.

Eu sempre usei esse estilo. Tenho uma antipatia pessoal pelo personagem _.


1
Não gostei do caractere _ até que o re-afiador adicionasse a seqüência do meio correspondente à inteligência. Agora eu posso digitar myIntegere ele vai combinar _myInteger. Mas eu não sabia que o MSDS diz para não usar o _
Vaccano

4
Se você usa a opção 1, como posso saber se myIntegeré uma variável local para um método ou um membro de classe particular?
Wizard79

4
@Lorenzo this.myInteger;)
TWith2Sugars

12
Mas mas ... "this" tem 4 caracteres e "_" é apenas um! Na verdade, essa diretriz faz muito sentido, mas no meu escritório todos adoram sublinhado e odeiam ver "this.Foo", por qualquer motivo. Às vezes, as únicas diretrizes importantes são as que seu local de trabalho impõe a você.
CodexArcanum

2
O argumento sobre o número de caracteres é discutível. Você não precisa digitar thistodas as vezes, apenas nos métodos em que uma variável local com o mesmo nome está presente. No entanto, você deve escrever um símbolo extra sempre que usar um sublinhado. O que eu concordo é que a aderência ao seu contrato de estilo de código local é sempre importante.
Malcolm

25

Eu uso a opção 4 acima:

private int _myInteger;

Eu gosto de ter alguma indicação de escopo nos nomes de minhas variáveis ​​e o sublinhado é suficiente para esse fim. Também é muito fácil de ler.


5
Não concordo que seja fácil de ler, principalmente se você precisar operar com várias variáveis.
Restuta 29/09

15

Eu uso o seguinte esquema de nomenclatura:

  • 1º (myInteger) para variáveis ​​com escopo local
  • 2º (MyInteger) para propriedades públicas
  • 4º (_myInteger) para variáveis ​​privadas

14

Eu acho que a opção 4 é realmente a opção mais legível. Isso ajuda você a ter que fazer isso:

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

Também torna todos os membros privados mais visíveis. No exemplo a seguir, de onde o diabo está agevindo? Sem o thisqualificador, é mais difícil dizer.

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

É muito mais fácil entender:

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

1
Eu costumava jurar pelo seu primeiro exemplo, mas depois de tentar a opção 4 por um tempo, prefiro usar sublinhados como prefixo para campos particulares.
Jeremy Wiebe

2
Eu digo, use 1 para variáveis ​​privadas, use 4 para variáveis ​​privadas usadas em propriedades.
Evan Plaice

2
Eu tenho que discordar do ChaosPandoin. Para mim, ambas as implementações de Method () são fáceis de ler. Assim que vejo a variável age (ou _age) e percebo que ela não é declarada no método, percebo que ela deve ser declarada em outro lugar da classe. O qualificador this é horrível, mas pelo menos está confinado ao método construtor.
David Kennedy

10

Primeiro, PascalCasing é geralmente reservado para propriedades públicas, consts, métodos, etc, da classe. Então eu pularia 2 e 5.

Segundo, a notação húngara é desencorajada no mundo .NET, então (uh, acho) o 3 está certo. Supondo que é isso que está acontecendo com 3.

Isso sai com camelCasing e _camelCasing. Eu normalmente uso _camelCasing para variáveis ​​de classe e camelCasing antigo simples para variáveis ​​com escopo definido para um método ou mais restrito. Camel case é o padrão aceito usado para argumentos de métodos, nomes de variáveis ​​protegidas / privadas e variáveis ​​dentro de um método ou escopo mais restrito.

Também gosto de acrescentar o sublinhado para que minhas variáveis ​​privadas sejam agrupadas no meu intellisense. No entanto, eu faço isso apenas para variáveis ​​com escopo definido para um tipo. Variáveis ​​declaradas em um método ou escopo mais restrito deixo o sublinhado desativado. Facilita mantê-los separados e manter as variáveis ​​menos usadas juntas.


2
Eu não entendo por que você usaria _camelCasing para variáveis ​​de classe, pois geralmente é óbvio que elas são variáveis ​​de classe.
alternativa

1
@ não, não é óbvio no intellisense. Lembre-se de que os campos (variáveis ​​de escopo de classe) têm (quase) o mesmo ícone que as variáveis ​​de escopo de método; portanto, elas têm a mesma aparência se você não olhar de perto. O sublinhado ajuda a diferenciá-los visualmente e os mantém agrupados, o que ajuda se você não os estiver usando com frequência (que você não deveria ter, pois o estado é o inimigo da programação sem erros).
Rasgado

Eu nunca disse nada sobre o Intellisense. Eu estou falando sobre a diferença entre Color.ClassMethod () e myColor.InstanceMethod (), a saber, que deve ser óbvio que, como Color é uma classe, ClassMethod () é um método de classe.
alternativa

@ você antes: I don't understand why you would use _camelCasing for class variables você depois: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()Com licença, enquanto estou confuso. Escute, eu raramente uso variáveis ​​de classe, por isso é bom lembrar seus nomes pressionando _ e fazendo com que todas elas apareçam no intellisense agradável e agrupadas.
Rasgado

2
@mathepic: Quando Will diz "variáveis ​​de classe", ele quer dizer campos de instância (privados). Você parece ter interpretado o que ele disse como membros estáticos; mas não foi o que ele disse.
Dan Tao

4

private int integer

Se você ficar confuso entre as variáveis ​​membro e local em um escopo de método, provavelmente precisará refatorar.


+1: é isso que acredito ser o ponto. BTW: Eu vejo sua fonte, mas o nome integerpoderia ser melhor reformulado, talvez value?
Wolf

2

Acredito que a melhor maneira de fazer isso (em C # / .net de qualquer maneira) é uma combinação de 2 e 6:

private int MyInteger { get; set; }

Teoricamente, não há nenhuma variável aqui, mas ela parece e age como uma variável de instância privada. Se precisarmos adicionar alguma lógica de negócios a esse valor (é um valor completamente interno, para que possamos fazer o que quisermos, afinal de contas), ele já estará 'propriedade' para nós. Uma xícara quente e fumegante de vitória!


2

Eu faço a opção 4 porque é assim que o SSCLI se parece, mas sinceramente não me importo muito em nomear variáveis ​​privadas. Público é uma história diferente.

BTW você esqueceu m_MyInteger


2

Eu não chamaria isso de "meu" nada!

Mas eu diria

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

muitas vezes isso é melhor do que ter variáveis ​​explícitas. Se eu tivesse uma variável privada explícita, eu a chamariaint _variableName;


1

Em C ++, costumo usar _ como alterno muito entre editores, o que não me permite ver se é privado.

Para C #, costumo deixar o _ ausente, pois o Visual Studio me permite ver se é privado.

Eu costumo usar a maneira Camel Case para fazer isso.


1

Eu uso 4 ( private int _myInteger;) porque:

private int myInteger;

É assim que eu nomeio minhas variáveis ​​locais.

private int MyInteger;

É assim que eu nomeio constantes.

private int mMyInteger;

Este não é o estilo c #.

private int _MyInteger;

Isso parece estranho.


1

com o sublinhado.

Bill Wagner explica o porquê em C # eficaz . Mas eu nunca nomearia um número inteiro como meu inteiro , melhor algo como _age ou _length. Incluir o TypeName no nome da instância é uma prática horrível. Os nomes devem ser auto-explicativos e, como o C # é seguro, os tipos podem ser encontrados sempre.


1
Sim, foi um exemplo.
Vaccano 10/09/10

1

Você precisa dar um exemplo mais específico, mas:

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

A propósito, você obtém tudo isso GRATUITAMENTE ao instalar e começar a usar os melhores e mais recentes MSFT Stylecop.


0

Eu vou pela opção 5: private int _MyFoo

Não vejo nenhuma vantagem competitiva real sobre o _myFoo.


0

Use camelCasing para variáveis ​​privadas como myInteger

Considere um precedente _se a variável for um backup de uma propriedade para reduzir confusões -
Variável _myPropertypara propriedadeMyProperty


0

Eu tenho o ReSharper nomeando minhas variáveis, não apenas as minhas, mas todo mundo faz isso também. Existe uma grande quantidade de consistência no projeto.


0

O padrão de codificação C # IDesign de Juval Lowy é bastante popular. Este padrão recomenda prefixar variáveis ​​de membro privadas com "m_" (Opção 6). É o que fazemos em nossa equipe.

private int m_myInteger;

A opção 4 ( _myInteger) é uma variação aceitável deste padrão.

Não gostei da recomendação do MSDN ( myInteger), porque dificulta distinguir um membro privado de uma variável local. A recomendação deles, é claro, resolve esse problema qualificando membros privados this, o que me parece redundante.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.