Souligner ou ne pas souligner, telle est la question


131

Y a-t-il des problèmes avec le fait de ne pas préfixer les champs privés avec un trait de soulignement en C # si la version binaire va être consommée par d'autres langages du framework? Par exemple, puisque C # est sensible à la casse, vous pouvez appeler un champ "foo" et la propriété publique "Foo" et cela fonctionne très bien.

Cela aurait-il un effet sur un langage insensible à la casse tel que VB.NET, y aura-t-il des problèmes de conformité CLS (ou autres) si les noms ne peuvent être distingués que par la casse?


18
Le but du préfixe de soulignement, BTW, n'est pas de traiter les problèmes de cas. C'est pour pouvoir distinguer facilement et visuellement les champs et les locaux lors de la lecture du code. Je vais l'utiliser aussi bien en C # qu'en VB.
Neil Hewitt le

2
@NeilHewitt: Eh bien, cela empêche également les paramètres de fonction d'entrer en conflit avec les variables membres, qui nécessitent de faire précéder chacune d'entre elles this, ce qui est nul. EDIT: Je viens de répondre à un commentaire de quatre ans ...
Ed S.

Pour plus de clarté, la norme officielle est _camelCase(favorisée en lecture seule) github.com/dotnet/corefx/blob/master/Documentation
Chris Marisic

Je préfère _camelCase pour les magasins de soutien privés. c'est-à-dire: le fichier privé qui contient les données attribuées et accessibles via une propriété. Je n'aime pas les propriétés automatiques car elles ne peuvent pas être initialisées à une valeur connue dans la définition de classe, et si je veux un effet secondaire dans le setter, j'ai besoin d'un magasin de support explicitement déclaré. Malheureusement, cela est remanié lorsque j'utilise ^ R ^ E dans l'éditeur c #, donc je dois le rajouter ... à chaque fois.
TomXP411

Réponses:


47

Cela n'aura aucun effet.

Une partie des recommandations pour écrire des bibliothèques conformes CLS est de NE PAS avoir deux entités publiques / protégées qui ne diffèrent que par cas, par exemple vous ne devriez PAS avoir

public void foo() {...}

et

public void Foo() {...}

ce que vous décrivez n'est pas un problème car l'élément privé n'est pas disponible pour l'utilisateur de la bibliothèque


1
Même s'il n'y aura aucun effet, c'est toujours une convention avec laquelle je ne serais pas à l'aise - car c'est une recette de confusion si elles ne diffèrent que par cas. Il est tout simplement trop facile de mal lire ou de taper si la seule différence est le capital initial.
ChrisA

2
PS Personnellement, je ne souligne pas en C #. Pour moi, c'est une préférence personnelle, pas une croyance religieuse
Binary Worrier

1
J'ai fait dans les deux sens et je voulais me décider, un et pour tous, sur la base des connaissances: P
TheCodeJunkie

46
J'utilise des traits de soulignement. Il est plus facile de les distinguer des arguments et des variables locales.
Rinat Abdullin le

4
J'utilise _ uniquement pour les champs privés, mais je n'ai presque jamais de champs privés en raison de la propriété 3.5 auto. Généralement, le seul moment où j'ai un champ privé est si j'implémente le chargement différé sur des types non primitifs.
Chris Marisic

279

MISE À JOUR IMPORTANTE (12 avril 2016):

Il a été porté à notre attention que le standard interne de l'équipe .NET CoreFX insiste sur l'utilisation de la notation de soulignement sans donner aucune idée de pourquoi. Cependant , si nous regardons de près la règle n ° 3 , il devient évident qu'il existe un système de _, t_, s_préfixes qui suggère pourquoi _a été choisi en premier lieu.

  1. Nous utilisons _camelCasepour les champs internes et privés et utilisons en lecture seule lorsque cela est possible. Préfixez les champs d'instance avec _, les champs statiques avec s_et les champs statiques de thread avec t_. Lorsqu'il est utilisé sur des champs statiques, readonlydoit venir après static(c'est-à-dire static readonlypas readonly static).
  2. Nous évitons à this.moins que cela ne soit absolument nécessaire.

Donc, si vous êtes juste comme l'équipe .NET CoreFX travaillant sur un code de niveau système multithread critique pour les performances , il est FORTEMENT SUGGÉRÉ que vous:

  • respecter leurs normes de codage et
  • utilisez la notation de soulignement et
  • ne lisez plus cette réponse

Sinon, lisez la suite ...

LA RÉPONSE ORIGINALE:

Mettons-nous d'abord d'accord sur ce dont nous parlons. La question est de savoir comment nous accédons aux membres d'instance à partir de méthodes non statiques et de constructeurs d'une classe / sous-classes si les modificateurs de visibilité le permettent.

Notation de soulignement

  • vous suggère d'utiliser le préfixe "_" dans les noms des champs privés
  • il dit aussi que vous ne devriez jamais utiliser "this" sauf si c'est absolument nécessaire

Cette notation

  • suggère de toujours utiliser «ceci». pour accéder à n'importe quel membre de l'instance

Pourquoi cette notation existe-t-elle?

Parce que c'est comme ça que tu

  • distinguer un paramètre d'un champ lorsqu'ils partagent le même nom
  • assurez-vous que vous travaillez dans le contexte de l'instance actuelle

Exemple

public class Demo
{
   private String name;
   public Demo(String name) {
       this.name = name;
   }
}

Pourquoi la notation de soulignement existe-t-elle?

Certaines personnes n'aiment pas taper "ceci", mais elles ont toujours besoin d'un moyen de distinguer un champ et un paramètre, elles ont donc accepté d'utiliser "_" devant un champ

Exemple

public class Demo
{
   private String _name;
   public Demo(String name) {
      _name = name;
   }
}

On peut penser que c'est juste une question de goût personnel et que les deux manières sont également bonnes / mauvaises. Cependant, il y a certains aspects où cette notation bat la notation de soulignement:

Clarté

  • la notation de soulignement encombre les noms
  • cette notation garde les noms intacts

Charge cognitive

  • la notation de soulignement est incohérente, elle vous fait traiter les champs d'une manière spéciale, mais vous ne pouvez pas l'utiliser avec d'autres membres, chaque fois que vous devez vous demander si vous avez besoin d'une propriété ou d'un champ

  • cette notation est cohérente, vous n'avez pas à penser, vous utilisez toujours "this" pour désigner un membre

MISE À JOUR: comme cela a été souligné, ce qui suit n'est pas un avantage

Entretien

  • La notation de soulignement vous oblige à garder un œil sur la _refactorisation, par exemple en transformant un champ en propriété (supprimer _) ou l'inverse (ajouter _)

  • cette notation n'a pas un tel problème

Autocompletion

Lorsque vous avez besoin de voir la liste des membres de l'instance:

  • la notation de soulignement ne vous aide pas beaucoup, car lorsque vous tapez "_", la fenêtre contextuelle de saisie semi-automatique vous montre les champs privés et tous les types disponibles à partir des assemblys liés mélangés avec le reste des membres de l'instance
  • this-notation vous donne une réponse claire, en tapant "this" tout ce que vous voyez est la liste des membres et rien d'autre

Ambiguïté

Parfois, vous devez gérer le code sans l'aide d'Intellisense. Par exemple, lorsque vous effectuez des révisions de code ou parcourez le code source en ligne.

  • La notation de soulignement est ambiguë: lorsque vous voyez Something.SomethingElse, vous ne pouvez pas dire si Something est une classe et SomethingElse est sa propriété statique ... ou peut-être Something est une propriété d'instance actuelle qui a sa propre propriété de SomethingElse

  • cette notation est claire: lorsque vous voyez Something.SomethingElse, cela ne peut signifier qu'une classe avec une propriété statique et lorsque vous voyez ceci.Something.SomethingElle vous savez que Something est un membre et SomethingElse est sa propriété

Méthodes d'extension

Vous ne pouvez pas utiliser de méthodes d'extensions sur l'instance elle-même sans utiliser «this».

  • la notation de soulignement nécessite que vous n'utilisiez pas "this", mais avec les méthodes d'extension, vous devez
  • cette notation vous évite les hésitations, vous utilisez toujours "this", point final.

Prise en charge de Visual Studio

  • underscore-notation n'a pas de prise en charge intégrée dans Visual Studio
  • this-notation est naturellement pris en charge par Visual Studio:

    1. "Ce." Qualification : préférez que tous les champs non statiques utilisés dans les méthodes non statiques soient précédés this.en C #

Recommandations officielles

Il existe de nombreuses directives officielles qui disent clairement "ne pas utiliser de traits de soulignement", en particulier en C #


22
C'est une réponse incroyable. Merci d'avoir pris le temps de compiler toutes ces informations.
Tigran

5
Ne vient pas de C ++, car en C ++ réserve les identificateurs commençant par un trait de soulignement pour les utilisations du langage et des bibliothèques standard.
Rob G

7
Pourquoi faites-vous la distinction entre le code de niveau système critique, multithread, et d'autres codes? Comment l'utilisation _camelCaseva-t-elle m'aider si mon code est critique en termes de performances / code de niveau système?
BornToCode

6
L'utilisation de traits de soulignement n'a rien à voir avec l'écriture de code critique pour les performances, multi-thread ou au niveau du système. C'est la cohérence qui compte et l'équipe CoreFX n'est qu'une équipe qui s'est mise d'accord sur une convention spécifique. C'est une excellente réponse, appuyée par une très belle analyse comparant les conventions de dénomination, mais je crois que la partie ajoutée disant "les traits de soulignement sont meilleurs parce que l'équipe CoreFX le dit" diminue vraiment sa qualité.
Şafak Gür

5
Mon problème est que je comprends l'inférence logique. fr.wikipedia.org/wiki/Inference Mais bon, je comprends que ce n'est pas pour tout le monde.
user603563

67

Extrait du fichier d'aide de Microsoft StyleCop:

TypeName: FieldNamesMustNotBeginWithUnderscore

CheckId: SA1309

Cause: un nom de champ en C # commence par un trait de soulignement.

Description de la règle:

Une violation de cette règle se produit lorsqu'un nom de champ commence par un trait de soulignement.

Par défaut, StyleCop interdit l'utilisation de traits de soulignement, m_, etc., pour marquer les champs de classe locaux, en faveur du «ceci». préfixe. L'avantage d'utiliser «ceci». est qu'il s'applique également à tous les types d'élément, y compris les méthodes, propriétés, etc., et pas seulement aux champs, rendant tous les appels aux membres de la classe immédiatement reconnaissables, quel que soit l'éditeur utilisé pour afficher le code. Un autre avantage est qu'il crée une différenciation rapide et reconnaissable entre les membres d'instance et les membres statiques, qui ne seront pas préfixés.

Si le nom du champ ou de la variable est destiné à correspondre au nom d'un élément associé à Win32 ou COM et doit donc commencer par un trait de soulignement, placez le champ ou la variable dans une classe NativeMethods spéciale. Une classe NativeMethods est une classe qui contient un nom se terminant par NativeMethods et est conçue comme un espace réservé pour les wrappers Win32 ou COM. StyleCop ignorera cette violation si l'élément est placé dans une classe NativeMethods.

Une description de règle différente indique que la pratique préférée en plus de ce qui précède est de commencer les champs privés avec des lettres minuscules et les champs publics avec des lettres majuscules.

Edit: En guise de suivi, la page du projet de StyleCop se trouve ici: https://github.com/DotNetAnalyzers/StyleCopAnalyzers . La lecture du fichier d'aide donne beaucoup d'informations sur les raisons pour lesquelles ils suggèrent diverses règles stylistiques.


7
C'est surtout une sorte de «meilleures pratiques». Comme l'indique la règle, le préfixe avec "this" peut être appliqué à n'importe quel membre non statique tandis que le préfixage avec autre chose peut ne pas être applicable en raison des règles de syntaxe du langage. Le mot clé "this" rend la destination prévue très claire.
Scott Dorman

5
Je préfère également la solution du problème au problème («ceci») à des moyens artificiels de le contourner.
galaktor

10
Il y a aussi une règle dans le même logiciel qui dit que vous ne devriez pas avoir deux champs différents uniquement au cas où. Alors, que faites-vous avec une variable protégée encapsulée par une propriété publique?
Lilith River

5
Mon seul problème avec le `` pas de soulignement '' est que lors de la programmation contre un formulaire (Web) ou autre, utiliser simplement `` ceci '' ne m'aide pas du tout à filtrer vers les champs privés que j'ai définis et me donne simplement une liste gigantesque des huit millions d'autres propriétés incluses avec ledit objet.

14
StyleCop semble dire que, si j'utilise systématiquement thisquand je fais référence à n'importe quel membre de classe, je pourrais trouver tous les appels à tous les membres de classe simplement en recherchant this. Je ne peux pas contester cela, mais je ne peux pas non plus penser à un moment où j'avais besoin de le faire. La dernière chose que je veux faire est d'ajouter de l'ennui au codage et de jeter mon code avec this(qui est presque hongrois) pour presque aucun gain pratique. Le fait est que si je regarde une ligne de code, tout ce qui commence par une majuscule ou un trait de soulignement est un membre de la classe, tout ce qui est en minuscule est un local.
devuxer

27

Puisque nous parlons d'un champ privé, cela n'affecte pas un utilisateur de votre classe.

Mais je recommande d'utiliser un trait de soulignement pour le champ privé, car cela peut rendre le code plus facile à comprendre, par exemple:

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

Dans notre équipe, nous utilisons toujours un préfixe de soulignement pour les champs privés. Ainsi, en lisant du code, je peux très facilement identifier les champs privés et les distinguer des locaux et des arguments. D'une certaine manière, le trait de soulignement peut être vu comme une version abrégée de «ceci».


14
Eh bien, je préfixe toujours «ceci», peu importe si j'accède à un champ, une propriété ou une méthode.
TheCodeJunkie

9
Pour moi, le trait de soulignement est une sorte de notation abrégée de «ceci».
M4N

2
Dans R #, le conseil est de ne pas appeler le paramètre foo. Pourquoi ne pas l'appeler «valeur» puisque vous savez qu'il sera utilisé pour Set Foo?
thinkbeforecoding le

17
@Martin: Le problème avec le trait de soulignement comme raccourci pour «ceci» est qu'il ne peut pas nécessairement être appliqué à tous les membres de la classe alors que «ceci» le peut. Je pense que le code lit beaucoup plus facile / plus propre avec le mot-clé "this". Dans votre exemple, le if (foo == x) fera toujours référence au paramètre foo.
Scott Dorman

3
@TheCodeJunkie: C'est beaucoup de caractères redondants dans votre base de code.
Ed S.

15

Après avoir travaillé dans un environnement qui avait des règles de style très spécifiques et très inutiles depuis, j'ai continué à créer mon propre style. C'est un type que j'ai inversé beaucoup. J'ai finalement décidé que les champs privés seront toujours _field, les variables locales n'auront jamais _ et seront en minuscules, les noms de variables pour les contrôles suivront vaguement la notation hongroise et les paramètres seront généralement camelCase.

Je déteste le this.mot - clé, il ajoute juste trop de bruit de code à mon avis. J'adore Resharper's remove redondant ceci. mot-clé.

Mise à jour de 6 ans: J'analysais les internes de Dictionary<TKey,T>pour une utilisation spécifique de l'accès concurrent et j'ai mal interprété un champ privé comme une variable locale. Les champs privés ne devraient certainement pas avoir la même convention de dénomination que les variables locales. S'il y avait eu un trait de soulignement, cela aurait été incroyablement évident.


18
Le thismot-clé est une référence garantie à l'objet courant. Vous n'obtenez pas cela avec un trait de soulignement. Pas besoin de détester this.
Jason S

15
Pourquoi inventer un «standard». 'ce.' vous indique que l'objet est une variable d'instance «Classe». vous dit que c'est une variable de classe. Tout le reste est une variable de pile. Le trait de soulignement appartient au même tas de mauvaises idées où la notation hongroise se décompose maintenant.
Quarkly

4
@ DRAirey1 trop facile de rater ça. quand vous en avez besoin et que vous finissez par faire des choses bizarres avec l'état.
Chris Marisic

3
@ChrisMarisic Vous êtes bien sûr les bienvenus à votre avis sur l'utilisation de _, mais ne le posez pas comme une norme établie alors que ce n'est clairement pas le cas.
écraser

3
Je t'ai perdu à "J'ai continué à créer mon propre style".
rory.ap

12

J'aime le trait de soulignement, car je peux alors utiliser le nom en minuscules comme paramètres de méthode comme celui-ci:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

39
chaîne publique FirstName {get; ensemble privé; }
jason

3
Vous pouvez toujours utiliser les minuscules comme paramètre de méthode, en utilisant le thismot - clé. Ce qui en fait un point muet dans le courant et toujours controversé "souligner ou non":public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
C'est l'avenir, maintenant juste public string FirstName { get; }et le passeur est toujours disponible dans le constructeur
Chris Marisic

Dans cet exemple. thisne serait nécessaire que dans le constructeur. Pas besoin de l'utiliser ailleurs. Donc, firstNamecomme le nom du champ fonctionne très bien.
Thomas Eyde

9

J'aime toujours beaucoup utiliser des traits de soulignement devant les champs privés pour la raison mentionnée par Martin, et aussi parce que les champs privés seront ensuite triés dans IntelliSense. Ceci malgré la méchanceté des notations de préfixes hongrois en général.

Cependant, ces derniers temps, je trouve que l'utilisation du préfixe de soulignement pour les membres privés est mal vue, même si je ne sais pas trop pourquoi. Peut-être que quelqu'un d'autre le sait? Est-ce juste le principe du préfixe? Ou y avait-il quelque chose impliqué dans la transformation des noms de types génériques qui obtiennent des traits de soulignement dans les assemblys compilés ou quelque chose?


4
Pour moi, le _ encombre les _ mots lorsque _ scanne rapidement le code, cela devient moins comme lire _et _plus _ comme devoir s'arrêter à _ chaque _ pour le reconnaître et _ réaliser que ce n'est pas un caractère de contrôle d'un _ tri. Cela perturbe également l'indentation en poussant pratiquement le premier caractère utile dans les noms de champ d'une colonne vers la droite. Je n'aime généralement pas le C ++ parce que la plupart des programmeurs en C ++ ont tendance à écrire un code de type symbole / machine incroyablement concis et lent à lire et je préfère simplement ne pas avoir cela dans le code C # :)
Oskar Duveborn

23
Pour moi, le this. encombre les this.words lorsque vous parcourez rapidement le code, cela devient moins comme lire ceci.et cela.plus cela.voir à arrêter et tout cela. pour le reconnaître et ceci.Réalisez que c'est ceci.pas un caractère de contrôle de certains this.sort. Je préférerais de loin trouver l'occasionnel _fieldFooou _fieldBarque mon utilisation soit encombrée de this.fieldFooou this.fieldBar. Je trouve le this.préfixe beaucoup plus discordant qu'un trait de soulignement principal.
AggieEric

Je pensais que cette divergence d'expérience pourrait peut-être provenir de systèmes de fichiers oldschool ou de protocoles de transfert de fichiers où les espaces n'étaient pas autorisés, ce qui a entraîné certains utilisateurs à voir les traits de soulignement comme des espaces et donc à ne pas distraire leur lecture. D'un autre côté, j'ai des problèmes avec de tels noms de fichiers car j'ai toujours utilisé des espaces dans mes propres noms de fichiers depuis le début ...
Oskar Duveborn

1
@AggieEric a frappé le clou sur la tête là-bas. La simple lecture de sa phrase me fait mal à la tête! J'ai essayé de m'en tenir à la recommandation de la SP pendant des années dans ce domaine, et j'étais tellement malade de lire des petits thismots bleus partout, j'ai pris une décision de nerd-rage juste là. Maintenant, j'utilise religieusement thispour les références de propriété UNIQUEMENT, ou lorsque j'ai besoin de faire une distinction explicite entre thiset base. Chacun à son propre, je suppose :-)
Riegardt Steyn

1
Je pense que c'est parce que, en fin de compte, commencer quoi que ce soit avec un caractère de ponctuation nuit à la lisibilité. Cela ne semble pas déranger tout le monde, mais pour moi, cela semble très contre nature de lire tout ce qui commence par la ponctuation. Plus le code est anglais, plus je le trouve facile à lire. Et avec les IDE modernes, il est très simple de faire la différence entre les locaux et les membres privés, car ils seront probablement de couleurs différentes.
Tim Long

5

Recommandation de style Cop ou non, creuser dans le .NET Framework montre une grande utilisation de «_» pour les variables membres. Quoi que recommandent les créateurs de Style Cop, ce n'est pas ce que la majorité des employés de MS utilisent. :) Je m'en tiendrai donc au trait de soulignement. Parce que personnellement, je fais beaucoup moins d'erreurs en utilisant le trait de soulignement que le this (exemple: en utilisant varName = varName au lieu de this.varName = varName, c'est vraiment coincé en moi)


3
Underscore est également recommandé pour le guide de style .NET core: github.com/dotnet/corefx/wiki/Coding-style
landoncz

3

Je pense que dans l'ensemble, les champs au niveau de la classe sont une erreur dans la conception du langage. J'aurais préféré que les propriétés de C # aient leur propre portée locale:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

Cela permettrait d'arrêter complètement d'utiliser les champs.

La seule fois où je préfixe un champ privé avec un trait de soulignement, c'est lorsqu'une propriété nécessite un champ de sauvegarde séparé. C'est aussi la seule fois que j'utilise des champs privés. (Et comme je n'utilise jamais de champs protégés, internes ou publics, c'est la seule fois où j'utilise la période des champs.) En ce qui me concerne, si une variable doit avoir une portée de classe, c'est une propriété de la classe.


Le gang C # semble être d'accord avec vous avec le nouveau private int foo {get; set;} sucre de syntaxe.
Dana le

Oh, bien sûr; ce que je décris ici est totalement irréalisable sans cela.
Robert Rossney

Ce que vous décrivez, ce sont des "propriétés implémentées automatiquement". Malheureusement, avec Visual Basic.NET, cela utilise en fait une variable _prefix "cachée" dans les coulisses, c'est-à-dire si vous aviez une propriété implémentée automatiquement "Public Property Foo As Integer", vous ne pourriez alors PAS avoir la déclaration de variable membre "Private _foo as Integer "

Non, je ne décris pas les propriétés implémentées automatiquement, du moins pas dans mon exemple. Je décris un niveau de portée qui n'existe pas en C # ou VB. Il est vraiment dommage que VB ait choisi une manière aussi simple de modifier les noms des champs de sauvegarde. C # est assez moche pour que vous ne créiez jamais une variable avec le même nom par accident.
Robert Rossney

3

La notation _fieldName pour les champs privés est si facile à briser . En utilisant «ceci». la notation est impossible à briser. Comment briseriez-vous la notation _? Observer:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

Voilà, je viens de violer votre convention de nommage mais ça compile. Je préférerais avoir une convention de dénomination qui a) n'est pas hongroise et b) explicite. Je suis en faveur de la suppression de la dénomination hongroise et cela qualifie en quelque sorte. Au lieu d'un type d'objet devant le nom de la variable, vous avez son niveau d'accès.

Comparez cela avec Ruby où le nom de la variable @my_number lie le nom dans la portée et est incassable.

edit: Cette réponse est devenue négative. Je m'en fiche, ça reste.


11
Ce n'est guère une critique valable d'une convention de dénomination de dire qu'il est possible pour les développeurs de ne pas la suivre.
Robert Rossney

8
Wow, votre définition de «facile à casser» et la mienne sont, comme, complètement opposées. Le vôtre signifie «facile à casser intentionnellement», tandis que la plupart des autres veulent probablement dire «facile à casser accidentellement ». Je vais laisser au lecteur un exercice pour déterminer lequel est le plus pertinent pour écrire un code lisible…
Konrad Rudolph

6
@Konrad: Vous avez l'air prétentieux quand vous dites "comme exercice pour le lecteur". Ce n'est pas un manuel de mathématiques.
jcollum

3
Un peu moins négatif maintenant :) Alors que nous pouvons ramer à contre-courant, je n'aime pas non plus la convention de soulignement. À mon avis, ce n'est pas différent de la notation hongroise et pour être honnête, cela me fait saigner les yeux (nuit à la lisibilité). Nous avons jeté la notation hongroise avec C # et il est temps de supprimer ce dernier vestige de ne pas faire confiance à votre IDE.
Tim Long

1
J'ai entendu dire que MS dit en fait que le trait de soulignement ne doit pas être utilisé dans son guide de style C #. blogs.msdn.microsoft.com/brada/2005/01/26/… - section 2.6 - on dirait que Brad Abrams est au moins d'accord avec nous!
jcollum

1

Lorsque vous souhaitez que votre assembly soit conforme CLS, vous pouvez utiliser l'attribut CLSCompliant dans votre fichier assemblyinfo. Le compilateur se plaindra alors lorsque votre code contient des éléments qui ne sont pas conformes à CLS.

Ensuite, lorsque vous avez 2 propriétés qui ne diffèrent que par cas, le compilateur émettra une erreur. Par contre, lorsque vous avez un champ privé et une propriété publique dans la même classe, il n'y aura aucun problème.

(Mais, je préfixe aussi toujours mes membres privés avec un trait de soulignement. Cela m'aide également à préciser quand je lis mon code qu'une certaine variable est un champ de membre).


0

J'aime utiliser des traits de soulignement devant mes champs privés pour deux raisons. On a déjà été mentionné, les champs se démarquent de leurs propriétés associées dans le code et dans Intellisense. La deuxième raison est que je peux utiliser les mêmes conventions de dénomination que je codifie en VB ou C #.


1
whoah, est-ce sage? Le soulignement ne signifie-t-il pas «continue sur la ligne suivante» dans VB?
JBRWilkinson

1
Uniquement si le trait de soulignement est suivi d'un espace.
Rob Windsor

La lettre initiale en minuscules ou en majuscules me
convient parfaitement

0

Il n'y a aucune implication. Lorsque votre code est compilé, tout ce qui est important pour le compilateur est l'espace de noms et la visibilité du champ / propriété. Un trait de soulignement est tout aussi significatif que tout autre caractère lors de la dénomination d'un identifiant. Le vrai truc est d'utiliser une convention que vous et les gens autour de vous comprendrez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.