É comum ver um _var
nome de variável em um campo de classe. O que significa o sublinhado? Existe uma referência para todas essas convenções de nomenclatura especiais?
c#
c++
naming-conventions
Stan
fonte
fonte
Respostas:
O sublinhado é simplesmente uma convenção; nada mais. Como tal, seu uso é sempre um pouco diferente para cada pessoa. Veja como eu os entendo para os dois idiomas em questão:
No C ++, um sublinhado geralmente indica uma variável de membro particular.
Em C #, normalmente vejo isso usado apenas ao definir a variável de membro privado subjacente para uma propriedade pública. Outras variáveis de membro privado não teriam um sublinhado. Esse uso foi largamente esquecido com o advento das propriedades automáticas.
Antes:
Depois de:
fonte
public string Name { get; private set; }
. É verdade que não é perfeitamente imutável, mas está lá._var
não está reservado.É uma prática recomendada NÃO usar UNDERSCORES antes de qualquer nome de variável ou parâmetro em C ++
Nomes começando com um sublinhado ou um sublinhado duplo são RESERVADOS para os implementadores de C ++. Os nomes com sublinhado são reservados para a biblioteca funcionar.
Se você tiver uma leitura no C ++ Coding Standard, verá que na primeira página diz:
Mais especificamente, o rascunho de trabalho da ISO indica as regras reais:
É uma prática recomendada evitar o início de um símbolo com um sublinhado, caso você acidentalmente vagueie por uma das limitações acima.
Você pode ver por si mesmo por que esse uso de sublinhados pode ser desastroso ao desenvolver um software:
Tente compilar um programa helloWorld.cpp simples como este:
Você verá tudo o que acontece em segundo plano. Aqui está um trecho:
Você pode ver quantos nomes começam com um sublinhado duplo!
Além disso, se você observar as funções membro virtuais, verá que * _vptr é o ponteiro gerado para a tabela virtual que é criada automaticamente quando você usa uma ou mais funções membro virtuais em sua classe! Mas isso é outra história ...
Se você usar sublinhados, poderá entrar em problemas de conflito e não terá idéia do que está causando isso, até que seja tarde demais.
fonte
Na verdade, a
_var
convenção vem do VB e não do C # ou C ++ (m _, ... é outra coisa).Isso veio para superar a insensibilidade do VB ao declarar Propriedades.
Por exemplo, esse código não é possível no VB porque considera
user
eUser
como o mesmo identificadorEntão, para superar isso, alguns usaram uma convenção para adicionar '_' ao campo privado e assim
Como muitas convenções são para .Net e para manter alguma uniformidade entre as convenções C # e VB.NET, elas estão usando a mesma.
Encontrei a referência para o que estava dizendo: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
fonte
O primeiro comentarista (R Samuel Klatchko) referenciou: Quais são as regras sobre o uso de sublinhado em um identificador C ++? que responde à pergunta sobre o sublinhado em C ++. Em geral, você não deve usar um sublinhado à esquerda, pois ele é reservado para o implementador do seu compilador. O código com o qual você está vendo
_var
provavelmente é um código herdado ou escrito por alguém que cresceu usando o antigo sistema de nomes que não desaprovava os sublinhados principais.Como outras respostas indicam, ele costumava ser usado em C ++ para identificar variáveis de membros da classe. No entanto, não tem significado especial no que diz respeito aos decoradores ou sintaxe. Então, se você quiser usá-lo, ele será compilado.
Vou deixar a discussão em C # para outras pessoas.
fonte
_var não tem significado e serve apenas para facilitar a distinção de que a variável é uma variável de membro privado.
No C ++, o uso da convenção _var é uma forma incorreta, porque existem regras que regem o uso do sublinhado na frente de um identificador. _var é reservado como um identificador global, enquanto _Var (sublinhado + letra maiúscula) é reservado a qualquer momento. É por isso que em C ++, você verá pessoas usando a convenção var_.
fonte
Você pode criar suas próprias diretrizes de codificação. Basta escrever uma documentação clara para o resto da equipe.
Usar _field ajuda o Intelilsense a filtrar todas as variáveis de classe apenas digitando _.
Eu geralmente sigo as Diretrizes de Brad Adams , mas recomenda não usar sublinhado.
fonte
O padrão de nomeação Microsoft para C # diz variáveis e parâmetros devem usar o formulário caso camelo menor IE:
paramName
. A norma também exige campos a seguir a mesma forma, mas isso pode levar a código claro tantas equipes pedir um prefixo sublinhado para melhorar a clareza IE:_fieldName
.fonte
Com o C #, as Diretrizes de Design do Microsoft Framework sugerem não usar o caractere sublinhado para membros públicos . Para membros privados , sublinhados podem ser usados. De fato, Jeffrey Richter (frequentemente citado nas diretrizes) usa um m_ por exemplo e um "s_" para membros estáticos privados.
Pessoalmente, uso apenas _ para marcar meus membros particulares. "m_" e "s_" se aproximam da notação húngara, que não é apenas desaprovada no .NET, mas pode ser bastante detalhada e acho que aulas com muitos membros são difíceis de fazer uma rápida verificação alfabética dos olhos (imagine 10 variáveis, todas começando com m_) .
fonte
Eu uso a nomeação _var para variáveis de membro de minhas classes. Existem 2 razões principais que eu faço:
1) Isso me ajuda a acompanhar as variáveis de classe e as funções locais quando leio meu código mais tarde.
2) Ajuda no Intellisense (ou outro sistema de conclusão de código) quando estou procurando uma variável de classe. Apenas conhecer o primeiro caractere é útil para filtrar a lista de variáveis e métodos disponíveis.
fonte
No que diz respeito às linguagens C e C ++, não há significado especial para um sublinhado no nome (início, meio ou fim). É apenas um caractere de nome de variável válido. As "convenções" vêm de práticas de codificação dentro de uma comunidade de codificação.
Como já indicado por vários exemplos acima, _ no início pode significar membros privados ou protegidos de uma classe em C ++.
Deixe-me contar uma história que pode ser divertida. No UNIX, se você possui uma função principal da biblioteca C e um back-end do kernel em que deseja expor a função do kernel ao espaço do usuário, o _ fica preso na frente do stub da função que chama a função do kernel diretamente sem fazer mais nada. O exemplo mais famoso e familiar disso é exit () vs _exit () nos kernels do tipo BSD e SysV: Lá, exit () faz coisas no espaço do usuário antes de chamar o serviço de saída do kernel, enquanto _exit apenas mapeia para o serviço de saída do kernel.
Então _ foi usado para coisas "locais", neste caso local sendo local da máquina. Normalmente _functions () não eram portáteis. Nesse sentido, você não deve esperar o mesmo comportamento em várias plataformas.
Agora, como _ nos nomes de variáveis, como
int _foo;
Bem, psicologicamente, um _ é uma coisa estranha a ser digitada no começo. Portanto, se você deseja criar um nome de variável que tenha menos chances de entrar em conflito com outra coisa, ESPECIALMENTE ao lidar com substituições de pré-processador, você deve considerar o uso de _.
Meu conselho básico seria seguir sempre a convenção da sua comunidade de codificação, para que você possa colaborar com mais eficiência.
fonte
Simplesmente significa que é um campo de membro da classe.
fonte
Não existe uma convenção de nomeação única em particular, mas já vi isso para membros particulares.
fonte
Muitas pessoas gostam de ter campos particulares com um sublinhado. É apenas uma convenção de nomenclatura.
As convenções de nomenclatura 'oficiais' do C # prescrevem nomes minúsculos simples (sem sublinhado) para campos particulares.
Não conheço as convenções padrão para C ++, embora os sublinhados sejam amplamente utilizados.
fonte
É apenas uma convenção que alguns programadores usam para deixar claro quando você está manipulando um membro da classe ou algum outro tipo de variável (parâmetros, local para a função, etc.). Outra convenção que também é amplamente utilizada para variáveis-membro é prefixar o nome com 'm_'.
De qualquer forma, essas são apenas convenções e você não encontrará uma única fonte para todas elas. Eles são uma questão de estilo e cada equipe, projeto ou empresa de programação tem o seu (ou até não o tem).
fonte
Há uma razão totalmente legítima para usá-lo em C #: se o código também deve ser extensível a partir do VB.NET. (Caso contrário, eu não faria.)
Como o VB.NET não diferencia maiúsculas de minúsculas, não há uma maneira simples de acessar o
field
membro protegido neste código:Por exemplo, isso acessará o getter de propriedades, não o campo:
Caramba, eu nem consigo escrever
field
em letras minúsculas - o VS 2010 continua corrigindo isso.Para torná-lo facilmente acessível para classes derivadas no VB.NET, é necessário criar outra convenção de nomenclatura. Prefixar um sublinhado é provavelmente o menos intrusivo e o mais "historicamente aceito" deles.
fonte
Agora, a notação usando "this" como neste.foobarbaz é aceitável para variáveis de membro da classe C #. Ele substitui a antiga "m_" ou apenas a notação "__". Isso torna o código mais legível, porque não há dúvida do que está sendo referência.
fonte
Pela minha experiência (certamente limitada), um sublinhado indicará que é uma variável de membro privado. Como Gollum disse, isso vai depender da equipe, no entanto.
fonte
Pergunta antiga, nova resposta (C #).
Outro uso de sublinhados para C # é o DI (injeção de dependência) do ASP NET Core.
readonly
Variáveis privadas de uma classe que foram atribuídas à interface injetada durante a construção devem começar com um sublinhado. Eu acho que é um debate se usar sublinhado para todos os membros privados de uma classe (embora a própria Microsoft o siga), mas este é certo.fonte
Uma convenção de nomenclatura como essa é útil quando você está lendo um código, principalmente um código que não é seu. Uma convenção de nomenclatura forte ajuda a indicar onde um membro específico é definido, que tipo de membro é etc. A maioria das equipes de desenvolvimento adota uma convenção de nomenclatura simples e simplesmente prefixa os campos dos membros com um sublinhado (
_fieldName
). No passado, eu usei a seguinte convenção de nomenclatura para C # (que é baseada nas convenções da Microsofts para o código de estrutura .NET, que pode ser visto no Reflector):Campo da instância: m_fieldName
Campo estático: s_fieldName Membro
público / protegido / interno: PascalCasedName ()
Membro privado: camelCasedName ()
Isso ajuda as pessoas a entender a estrutura, o uso, a acessibilidade e a localização dos membros ao ler códigos desconhecidos muito rapidamente.
fonte