Convention d'affectation des noms de soulignement en C++ et C# variables
Il est courant de voir un _var
nom de la variable dans un champ de la classe. Quel est le trait de soulignement veux dire? Est-il une référence pour toutes ces conventions de nommage?
- double possible de Quelles sont les règles concernant l'utilisation d'un trait de soulignement dans un C++ identifiant?
- Je suis en désaccord - c'est pas une copie exacte. Les questions se rapportent tous les deux à des traits de soulignement dans les noms de variable, mais qui sont complètement différentes des questions de contenu réel. (Pour l'un, celui-ci lui demande à propos de C#)
- Samuel - C'est un peu exagéré.
- l'autre thread semble mettre l'accent sur le C++. En C# il y a peut être d'autres raisons légitimes. E. g. l'inter-fonctionnement avec une pièce d'identité**tic insensible à la casse de la langue, comme le VB.
- Quelques égarés de l'entreprise de codification des lignes directrices suggèrent d'ajouter des verrues pour les variables membres afin de les distinguer des variables locales, sur une croyance que les classes et les fonctions se développera inévitablement tellement gonflé que vous ne pouvez pas tenir la trace de quoi il s'agit sans vague des indices de ce genre. Les personnes qui suggèrent de telles conventions sont trop souvent ceux dont le code le plus besoin d'eux.
- Votre déclaration générale n'est tout simplement pas vrai. J'ai trouvé que l'utilisation de la présente convention, il est beaucoup plus facile de numériser rapidement des méthodes et d'obtenir une bonne compréhension de la classe.
- alors il ne faut pas le lire comme une déclaration générale. "Certains" ne signifie pas "tous", et "trop souvent" ne signifie pas "toujours", et peut-être que vous êtes une exception à mon expérience.
- En C++, éviter des traits de soulignement. Dans de nombreux contextes (c'est à dire, au niveau global, lorsqu'une lettre majuscule suit etc.) ils sont réservés pour la mise en œuvre, et vous risquez d'avoir quelques macro piétiner sur eux. Donc, si vous voulez, faites-le fuite souligne.
- Mes excuses, j'ai l'impression de faire une grande quantité de compréhension de la lecture d'erreurs ces derniers temps...
Vous devez vous connecter pour publier un commentaire.
Le trait de soulignement est simplement une convention; rien de plus. En tant que tel, son utilisation est toujours un peu différente pour chaque personne. Voici comment je les comprends pour les deux langues en question:
En C++, un trait de soulignement indique généralement une variable membre privée.
En C#, j'ai l'habitude de le voir utilisé uniquement lors de la définition du sous-jacent variable membre privée pour une propriété publique. D'autres variables de membre privées n'aurait pas un caractère de soulignement. Cet usage a été, en grande partie à la trappe avec l'avènement de l'automatique propriétés bien.
Avant:
Après:
public string Name { get; private set; }
. Vrai, il n'est pas parfaitement immuable, mais il est là._var
n'est pas réservé.S'il vous plaît NE PAS utiliser de SOULIGNEMENT avant tout nom de variable ou d'un paramètre de nom en C++!!!
Les noms commençant par un caractère de soulignement ou un trait de soulignement double sont RÉSERVÉS pour le C++ exécutants. Les noms avec un trait de soulignement sont réservés à la bibliothèque pour travailler.
Si vous avez une lecture à la Norme de Codage C++, vous verrez que dans la première page il est dit:
Aussi, vous pouvez voir par vous-même pourquoi une telle utilisation de souligne peuvent être désastreuses lors du développement d'un logiciel.
Essayez de compiler un simple helloWorld.cpp programme comme ceci:
Vous verrez tout ce qui se passe en arrière-plan. Voici un extrait:
Vous pouvez voir comment beaucoup de noms de commencer avec un trait de soulignement double!
Aussi, si vous regardez virtuel fonctions de membre, vous verrez que *_vptr est le pointeur généré pour la table virtuelle qui est automatiquement créé lorsque vous utilisez un ou plusieurs virtuel fonctions de membre dans votre classe! Mais c'est une autre histoire...
Si vous utilisez des traits de soulignement, vous pourriez obtenir dans les questions de conflit et vous n'AVEZ AUCUNE IDÉE de ce qui en est la cause, jusqu'à ce qu'il soit trop tard.
_config
est qu'il est facile de faire accidentellement_XMLconfig
, qui peut entrer en conflit avec une mise en œuvre de la macro (majuscules, abréviations). Gardez à l'esprit un junior entretien programmeur a probablement au moins 50% de chance de ne pas savoir_XMLconfig
est mauvais, donc quand ils voient_config
est très bien, ils supposent_XMLconfig
est très bien.Fait le
_var
convention vient de VB, C# ou C++ (m_,... c'est autre chose).Il en est venu à surmonter le compte de la casse de VB lors de la déclaration de Propriétés
par exemple, le code n'est pas possible en VB, car il considère
user
etUser
que le même identifiantDonc, pour surmonter cette difficulté, certains ont utilisé une convention d'ajouter des '_' pour le domaine privé de venir comme ça
Depuis de nombreux convention sont pour .Net et de garder une certaine uniformité entre C# et VB.NET convention, ils sont en utilisant la même.
J'ai trouvé la référence de ce que je disais :
http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
Le premier intervenant (R Samuel Klatchko) référencées: Quelles sont les règles concernant l'utilisation d'un trait de soulignement en C++ d'identification? qui répond à la question sur le trait de soulignement en C++. En général, vous n'êtes pas censé utiliser un trait de soulignement, car il est réservé pour le responsable de l'implémentation de votre compilateur. Le code que vous voyez avec
_var
est probablement l'héritage de code, ou code écrit par quelqu'un qui a grandi à l'aide de l'ancien système de nommage qui n'a pas froncer les sourcils sur les principaux traits de soulignement.Comme d'autres réponses de l'état, il sert à être utilisé en C++ pour identifier les variables de membre de classe. Cependant, il n'a pas de signification particulière, autant que les décorateurs ou de la syntaxe va. Donc, si vous voulez l'utiliser, il va compiler.
Je vais laisser le C# de discussion pour les autres.
_var n'a pas de sens et ne sert que le but de les rendre plus faciles à distinguer que la variable est une variable membre privée.
En C++, à l'aide de la _var convention est mauvais, car il y a des règles régissant l'utilisation de l'underscore devant un identificateur. _var est réservé à un identificateur global, tandis que _Var (trait de soulignement + majuscule) est réservée à tout moment. C'est pourquoi, en C++, vous verrez des gens en utilisant le var_ de la convention de la place.
Vous pouvez créer vos propres règles de codage. Il suffit d'écrire une documentation claire pour le reste de l'équipe.
À l'aide de _field aide à la Intelilsense pour filtrer toutes les variables de classe, juste en tapant _.
J'ai l'habitude de suivre les Brad Adams Lignes Directrices, mais il recommande de ne pas utiliser le trait de soulignement.
Microsoft standard de nommage pour C#, dit variables et les paramètres doivent utiliser le bas du dos de chameau cas IE:
paramName
. La norme exige aussi des champs de suivre la même forme mais cela peut conduire à un manque de code pour de nombreuses équipes appel à un trait de soulignement préfixe pour améliorer la clarté IE:_fieldName
.Avec C#, Microsoft Cadre Des Lignes Directrices De Conception conseillons de ne pas utiliser le caractère de soulignement pour public membres. Pour privé membres, des traits de soulignement sont OK pour l'utiliser. En fait, Jeffrey Richter (souvent cité dans les lignes directrices) utilise une m_, par exemple) et un "s_" pour private static memberss.
Personnellement, je l'utilise juste _ pour marquer mes membres. "m_" et "s_" point sur la notation hongroise qui n'est pas seulement mal vu .NET, mais peut être très bavard et j'ai trouver des cours avec de nombreux membres de la difficile de faire un coup d'oeil de numérisation par ordre alphabétique (imaginez 10 toutes les variables commençant par m_).
- Je utiliser le _var les noms de variables membres de mes classes. Il y a 2 principales raisons pour lesquelles je fais:
1) Il m'aide à garder la trace des variables de classe et les locaux de la fonction de variables quand je suis en train de lire mon code plus tard.
2) Il aide dans Intellisense (ou d'autres de l'achèvement de code du système) lorsque je suis à la recherche d'une variable de classe. Tout en sachant que le premier caractère est utile dans le filtrage par le biais de la liste des variables disponibles et les méthodes.
Autant que les langages C et C++ sont concernés, il n'y a pas de signification particulière à un trait de soulignement dans le nom (début, milieu ou fin). C'est juste un nom de variable valide caractère. Les "conventions" sont issus de pratiques de codage à l'intérieur d'un codage de la communauté.
Comme déjà indiqué par divers exemples ci-dessus, _ dans le début peut signifier membres privés ou protégés d'une classe en C++.
Permettez-moi de donner un peu d'histoire qui peut être fun trivia. Dans UNIX, si vous ont une fonction de la bibliothèque C et un noyau back-end où vous souhaitez exposer la fonction du noyau vers l'espace utilisateur ainsi l' _ est coincé en face de la stub de fonction qui appelle la fonction noyau directement sans rien faire d'autre. Les plus célèbres et les plus familiers exemple de cela est de sortie (de) vs _exit() sous BSD et system v noyaux de type: Y, exit() n'a de l'espace utilisateur trucs avant d'appeler le noyau de la sortie de service, alors que _exit juste des cartes pour le noyau de la sortie de service.
Donc _ a été utilisé pour "local" des trucs dans ce cas local en machine locale. Généralement _functions() n'étaient pas portable. Dans que vous ne devriez pas attendre le même comportement à travers diverses plates-formes.
Maintenant, comme pour le _ dans les noms de variables, telles que
int _foo;
Bien psychologiquement, un _ est une chose étrange à avoir à taper le début. Donc, si vous voulez créer un nom de variable qui auraient moins de chances d'un affrontement avec quelque chose d'autre, SURTOUT lorsqu'il s'agit de pré-processeur de substitutions que vous souhaitez examiner les utilisations de _.
Mon conseil serait de toujours suivre la convention de votre codage de la communauté, de sorte que vous pouvez collaborer plus efficacement.
Il n'y a pas célibataire convention d'affectation de noms, mais j'ai vu que pour les membres privés.
Beaucoup de gens aiment avoir des champs privés préfixé par un trait de soulignement. C'est juste une convention de nommage.
C#'s 'officiel' des conventions de nommage prescrire simple des noms minuscules (pas de trait de soulignement) pour les champs privés.
Je ne suis pas au courant de conventions standard de C++, bien que des traits de soulignement sont très largement utilisés.
C'est juste une convention de certains programmeurs utilisent pour faire clair, lorsque vous la manipulez un membre de la classe ou un autre type de variable (paramètres, locale à la fonction, etc). Une autre convention qui est aussi largement utilisé pour des variables de membre est en préfixant le nom de 'm_'.
De toute façon, ce ne sont que des conventions et que vous ne trouverez pas une seule source pour tous. Ils sont une question de style et chaque équipe de programmation, le projet ou l'entreprise dispose de son propre (ou même ne pas en avoir).
Il est pleinement légitime de raison de l'utiliser en C#: si le code doit être extensible VB.NET ainsi.
(Sinon, je ne voudrais pas.)
Depuis VB.NET est est insensible à la casse, il n'y a pas de moyen simple d'accéder à l'protégé
field
membre dans ce code:E. g. cela permettra d'accéder à la propriété de lecture, pas le champ:
Diable, je ne peux même pas écrire
field
en minuscules - VS 2010 ne cesse de le corriger.Afin de les rendre facilement accessibles aux classes dérivées de VB.NET on doit trouver une autre convention de nommage. Préfixant par un trait de soulignement est sans doute le moins intrusif et le plus "traditionnellement accepté" d'entre eux.
Maintenant la notation à l'aide de "ce" dans ce.foobarbaz est acceptable pour C# variables de membre de classe. Il remplace l'ancien "m_" ou tout simplement "__" la notation. Cela rend le code plus lisible, car il ne fait aucun doute que ce qui est une référence.
De mon expérience (certes limitée), un trait de soulignement indique que c'est une variable membre privée. Comme Gollum dit, cela dépendra de l'équipe, bien que.
Il signifie simplement que c'est un champ de membre dans la classe.
Une convention de nommage comme ceci est utile lors de la lecture de code, et plus particulièrement un code qui n'est pas votre propre. Un fort convention de nommage permet d'indiquer l'endroit où un membre est défini, quel type de membre il est, etc. La plupart des équipes de développement d'adopter une simple convention de nommage, et tout simplement le préfixe membre de champs, avec un trait de soulignement (
_fieldName
). Dans le passé, j'ai utilisé la convention d'appellation suivante pour C# (qui est basé sur les directives de Microsoft conventions pour l' .NET framework code, qui peut être vu avec Réflecteur):Champ d'Instance: m_fieldName
Champ statique: s_fieldName
Public/Protected/Membre Interne: PascalCasedName()
Membre privé: camelCasedName()
Cela aide les gens à comprendre la structure, l'utilisation, l'accessibilité et l'emplacement des membres lors de la lecture de code inconnu très rapidement.