2010-04-28 1 views
15

Si j'accède à un champ membre, à une propriété ou à une méthode, je ne sais jamais quand je devrais ajouter "ceci".Quelle est une bonne règle pour quand ajouter des membres avec 'this' (C#)?

Je ne pose pas de questions sur les cas où cela est nécessaire, comme dans le cas où une variable locale porte le même nom. Je parle de cas où le sens est exactement le même. Lequel est le plus lisible? Y a-t-il des normes, des pratiques exemplaires ou des règles générales que je devrais suivre? Cela devrait-il être cohérent dans une classe ou dans une base de code entière?

+2

À mon humble avis de toute façon est bon tant que vous restez cohérent. – Brandi

+1

Similaire à: http://stackoverflow.com/questions/1562540/why-does-stylecop-recommend-prefixing-method-or-property-calls-with-this –

Répondre

13

Je recommande d'utiliser les directives de Microsoft, tel que vérifié par StyleCop: http://blogs.msdn.com/sourceanalysis/

La règle générale est, les membres de PREPEND avec "cela." quand ils sont définis dans la classe, à moins qu'ils ne soient statiques, auquel cas vous ne pouvez pas.

Voici la règle directement à partir StyleCop:

SA1101: The call to {method or property name} must begin with the 
'this.' prefix to indicate that the item is a member of the class. 
+0

J'ai pris l'habitude de le faire dans mes codes C# il y a quelques années, principalement pour profiter de l'intellisense, et c'est bloqué. Drôle je ne fais pas cela pour C++ (principalement le code en utilisant vim this-> est juste 6 caractères de plus à taper alors;). –

0

Dans mon code, je l'utilise seulement. <PropertyName> lorsque la propriété appartient à une classe de base et non à la classe dans laquelle je suis actuellement.

Bien sûr, ne pas utiliser 'ceci' est un autre choix populaire, car du code inutile est ajouté.

+1

Pourquoi ne pas utiliser base.Name à la place? –

+0

Je pourrais faire ça aussi. Il s'agit plutôt d'un rappel que la propriété n'est pas locale à ce fichier de code particulier. – Tejs

15

Je ne suis pas d'accord avec StyleCop sur celui-ci, et je ne suis même pas sûr que l'opinion de StyleCop devrait être interprétée comme une directive officielle Microsoft de toute façon. C'était un outil interne utilisé chez Microsoft mais toutes les équipes ne l'utilisent pas, et toutes les équipes n'utilisent pas toutes les règles.

Ajout de this partout n'est pas nécessaire et ajoute souvent un fouillis. Cela n'améliore pas les performances et je ne suis pas convaincu qu'ajouter this partout dans le code améliore la lisibilité soit. Vous pouvez entendre des arguments qui indiquent plus clairement où la variable est définie, mais je dirais que si votre classe/méthode est si longue et compliquée qu'il est difficile de savoir où quelque chose est déclaré, alors vous devriez probablement refactoriser de toute façon. Si vous utilisez le single responsibility rule et avez des fonctions courtes, il devrait être évident si une variable est un membre, un paramètre de fonction ou une variable locale.

Comme vous le signalez, parfois c'est nécessaire. Par exemple dans le constructeur si vous voulez définir un membre privé avec le même nom que le paramètre.

public class Foo 
{ 
    private Bar bar; 

    public Foo(Bar bar) 
    { 
     this.bar = bar; 
    } 
} 
+0

Si vous utilisez FxCop pour l'analyse de code statique, vos fonctions ne seront jamais trop longues, car elle vérifie la complexité cyclomatique. –

+0

@Kevin Albrecht: La complexité cyclomatique n'a rien à voir avec la longueur de la fonction. C'est à voir avec le nombre de chemins différents à travers le code. Il est possible d'avoir des fonctions courtes avec une complexité cyclomatique élevée et de longues fonctions avec une faible complexité. –

+0

Je comprends cela, mais ils sont évidemment liés. –

1

Si vous suivez StyleCop Microsoft, vous devriez toujours utiliser les membres de la classe préfixe avec le mot-clé this.

SA1101: PrefixLocalCallsWithThis
TypeName: PrefixLocalCallsWithThis
CheckId: SA1101 Catégorie: Lisibilité Règles

Voici un similar StackOverflow question sur le même sujet.

1

J'accède habituellement aux paramètres sur l'objet courant avec ceci.Compte tenu d'une convention de nommage pour les variables d'instance « m_ », ce qui rend facile de voir en un coup d'oeil ce qui est touché par la suite des déclarations sans connaître leur contexte:

m_Height += 10; // an instance variable 
height += 10;  // a local variable 
this.Height += 10; // a property 
+3

Ceci est mieux fait en utilisant "ceci". pour tous les membres. Et utilisez des minuscules pour les variables d'instance, pour clarifier lesquelles sont différentes. Instance variable: this.height. Local: hauteur. Propriété: this.Height. –

+2

Je suis d'accord avec Kevin, je ne suis pas un fan de la convention "m_"/ – ParmesanCodice

+0

Pour chacun son propre. m_height est plus courte que this.height. Notre groupe de développeurs a décidé que les champs d'instance utilisaient des noms différents des variables locales, ce qui était une bonne chose. En d'autres termes, dans un constructeur, nous utilisons 'm_height = height' au lieu de' this.height = height'. /hausser les épaules –

4

Je dirais d'éviter autant que possible, il vous permet d'économiser certains (en fait beaucoup de) taper.

Je dépendrais plus de Visual Studio pour m'aider à trouver ce qui appartient (n'oubliez jamais F12). Je n'utilise pas le bloc-notes pour lire mes fichiers cs: P

0

Nos normes de codage au travail stipulent que les variables membres ne doivent pas être préfixées avec «m» ou «_» ou tout ce que la plupart des gens utilisent. En fait, je me suis retrouvé à utiliser this.memberVariable tout le temps. Je préfère la clarté sur un peu de frappe supplémentaire. Et comme mentionné dans les autres réponses, il est nécessaire de faire référence à des paramètres portant le même nom que les variables membres.

0

Si vous utilisez Visual Studio et Intellisense. Lorsque vous tapez ceci, vous obtenez une liste de vos méthodes de variables au niveau de classe, etc. Ne tenez pas compte de tous les autres éléments possibles.

Questions connexes