167 votes

Souligner ou ne pas souligner, telle est la question

Y a-t-il des problèmes pour ne pas préfixer les champs privés avec un trait de soulignement en C # si la version binaire doit être utilisée par d'autres langages de structure? Par exemple, étant donné que C # est sensible à la casse, vous pouvez appeler un champ "foo" et la propriété publique "Foo". Cela fonctionne bien.

Cela aurait-il un effet sur un langage ne respectant pas 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 des majuscules?

342voto

1922 Points 1946

Nous allons tout d'abord s'entendre sur ce dont nous parlons. La question est de savoir comment nous avons accès les membres de l'instance de l'intérieur non-statiques les méthodes et les constructeurs d'une classe ou d'un de ses sous-classes, si modificateurs de visibilité permettent de faire cela.

Souligner notation

  • suggère que vous utilisez le "_" préfixe dans le nom des champs privés
  • il a également dit que vous ne devriez jamais utiliser le "ce", sauf si c'est absolument nécessaire

Cette notation

  • suggère que vous venez d'utiliser toujours "." pour accéder à tout membre de l'instance

Pourquoi cette notation existent?

Parce que c'est la façon dont vous

  • dire à part un paramètre à partir d'un champ lorsqu'ils partagent le même nom
  • assurez-vous que dans le contexte de la présente instance

Exemple

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

Pourquoi ne soulignent-notation existent?

Certaines personnes n'aiment pas taper "ce", mais ils ont encore besoin d'un moyen de distinguer un champ et d'un paramètre, c'est pourquoi ils ont décidé 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 la question de goûts personnels et les deux manières sont tout aussi bon/mauvais. Cependant, il ya certains aspects où cette notation bat le trait de soulignement-notation:

La clarté

  • souligner notation encombre noms
  • cette notation tient noms intacte

La cohérence

  • soulignez-la notation est incohérente, il fait de vous traiter les champs d'une manière spéciale, mais vous ne pouvez pas l'utiliser avec d'autres membres
  • cette notation est cohérente, vous n'avez pas à penser, que vous venez de toujours utiliser "ce" pour désigner tout membre

L'auto-complétion

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

  • souligner notation ne vous aide pas beaucoup, parce que quand vous tapez "_" la saisie semi-automatique popup vous montre les champs privés et tous les types liés assemblages mixtes avec le reste des membres de l'instance
  • cette notation donne une réponse claire, en tapant "ce" tout ce que vous voyez est la liste des membres, et rien d'autre

L'ambiguïté

Parfois, vous avez à traiter avec le code sans l'aide de l'Intellisense. Par exemple, lorsque vous sont en train de faire des revues de code ou de la navigation sur le référentiel de code source en ligne.

  • soulignez-la notation est ambigu: Quand vous voyez quelque Chose.SomethingElse vous ne pouvez pas dire si quelque Chose est une classe et SomethingElse est sa propriété statique... ou peut-être quelque Chose est une instance actuelle de la propriété qui dispose de sa propre propriété de SomethingElse
  • cette notation est clair: Quand vous voyez quelque Chose.SomethingElse il ne peut signifier qu'une classe avec une propriété statique et quand vous voyez cela.Quelque chose.SomethingElse vous savez que quelque Chose est membre et SomethingElse est sa propriété

Les méthodes d'Extension

Vous ne pouvez pas utiliser les extensions de méthodes sur l'instance elle-même sans l'aide de "cela".

  • souligner notation exige que vous n'utilisez pas "ce", mais avec l'extension des méthodes que vous avez à
  • cette notation vous permet d'économiser de l'hésitation, vous pouvez toujours utiliser "ce", période.

Support Visual Studio

  • souligner notation ne dispose pas d'un support intégré dans Visual Studio
  • cette notation est prise en charge par Visual Studio naturellement: http://www.screenr.com/zDCH

Les recommandations officielles

Il ya beaucoup de lignes directrices officielles qui disent clairement "ne pas utiliser de soulignement", en particulier en C#

75voto

Dan Rigby Points 5635

Prises à partir de la Microsoft StyleCop fichier d'Aide:

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 n'autorise pas l'utilisation de caractères de soulignement, m_, etc., pour marquer locale des champs de classe, en faveur de la " ce.' préfixe. L'avantage de l'utilisation de " cela. c'est la que ça s'applique à tous les types d'éléments, y compris les méthodes, propriétés, etc., et pas seulement les champs, faisant de tous les appels de membres de la classe instantanément reconnaissable, indépendamment de l'éditeur est utilisé pour afficher le code. Un autre avantage est qu'il crée un rapide, reconnaissable différenciation entre les membres de l'instance et des membres statiques, qui ne sera pas de préfixe.

Si le champ ou la variable nom est destiné à correspondre au nom de l'associé à un élément Win32 ou COM, et doit donc commencer par un caractère de soulignement, place le champ ou la variable à l'intérieur d'une spéciale NativeMethods classe. Un NativeMethods classe est toute la classe qui contient un nom se terminant par NativeMethods, et est conçu comme un espace réservé pour Win32 ou COM wrappers. StyleCop va ignorer cette violation si l'élément est placé à l'intérieur d'un NativeMethods classe.

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

Edit: En suivi, StyleCop la page du projet est situé ici: http://code.msdn.microsoft.com/sourceanalysis. La lecture du fichier d'aide donne un aperçu de beaucoup de raisons pour lesquelles ils suggèrent diverses règles stylistiques.

50voto

Binary Worrier Points 27424

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 parce que l'élément privé n'est pas disponible pour l'utilisateur de la bibliothèque

29voto

M4N Points 48758

Puisque nous parlons d'un domaine privé, il n'affecte pas les utilisateurs de votre classe.

Mais je recommande d'utiliser un trait de soulignement pour le domaine privé, car il peut rendre le code plus facile à comprendre, l'e.g:

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 trait de soulignement préfixe pour les champs privés. Ainsi, lors de la lecture du code, je peux très facilement identifier les champs privés et de les distinguer de la population locale et des arguments. En un sens, le soulignement, l'abeille vu comme une version courte de "this".

18voto

Lance Fisher Points 13547

J'aime le trait de soulignement, car je peux alors utiliser le nom en minuscule comme paramètre de méthode, comme ceci:

 public class Person
{
    string _firstName;

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X