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.
- Nous utilisons
_camelCase
pour 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, readonly
doit venir après static
(c'est-à-dire static readonly
pas readonly static
).
- 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
Recommandations officielles
Il existe de nombreuses directives officielles qui disent clairement "ne pas utiliser de traits de soulignement", en particulier en C #