8
votes

C # stylécop - en utilisant "ceci". Préfixe pour les membres de la classe de base tels que les membres de la classe actuelle ou non?

stylécop a une règle sur l'utilisation de "ceci". préfixe à appeler des membres de la classe (SA1101).

Est-ce que cette règle est tirée par un élément (par exemple une méthode) d'une classe héritée de sa classe de base. p>

Exemple: P>

class BaseClass
{
    protected void F1()
    {
        ...
    }
}    

class ChildClass : BaseClass
{
    protected void F2()
    {
        ...
    }

    protected void F3()
    {
        this.F2(); // This is correct acording to SA1101

        // F1 is a member of base class and if I dont put this prefix, stylecop will not show any message.
        this.F1(); // Is this correct?
        F1();      // Or this?
    }
}


3 commentaires

Eh bien, cela a frappé d'essayer de sortir de la stylécop dans ma liste de priorités, puis.


@Jon Hanna: Vous pouvez configurer quelles règles sont réellement exécutées. Je ne réduisais pas Styecop jusqu'à ce que vous ne le pensiez et décidez que les règles sont importantes / utiles pour vous.


@UNE. Karimi Il n'est pas pour la lisibilité, utilisez réellement Base ferait le code plus lisible, il est d'éviter les bugs. La documentation a un bon échantillon et une explication stylecop.soyuz5.com/sa1100.html


4 Réponses :


-3
votes

J'aime utiliser la base. base.f1 () pour votre cas. Cela empêche de référencer accidentellement une variable locale et est un rappel visuel de l'endroit où le membre est venu.


3 commentaires

C'est bien, mais dans ce cas, nous rencontrerons une autre règle dans STYLECOP (SA1100: l'appel à GetItem ne doit utiliser que le préfixe «base» si l'élément est déclaré virtuel dans la classe de base et une substitution est définie dans la classe locale. Sinon , préfixe l'appel avec cela plutôt que la base)


L'utilisation de "base" serait vraiment une mauvaise pratique si ce n'est pas la méthode de base de la méthode virtuelle actuelle que vous appelez. La méthode de base pourrait être faite virtuelle et vous (ou une autre personne dans la hiérarchie au-dessus de vous) pourrait vouloir le remplacer, puis votre appel de base appellerait la mauvaise méthode.


C'est vraiment une mauvaise pratique. Vous devez utiliser la base uniquement pour spécifier que vous souhaitez que la méthode de base au lieu de une définie dans cette classe. L'appelant partout autre que dans une surveillance ou un hider est au mieux. Il est sujet à une erreur et confondrait les autres qui examinent le code car ils l'interprètent comme étant utilisés raisonnablement et être confondus quant à pourquoi ils ne pouvaient pas trouver la méthode de suralimentation ou de cachette.



0
votes

Je crois que cela est correct puisque la règle détient toutes les méthodes, qu'il soit défini sur la base ou non. Personnellement, je ne suis pas un grand fan de cette règle, donc je le désactive.


1 commentaires

Je suis d'accord avec vous mais y a-t-il quelqu'un ou quelque chose comme stylécop qui explique à ce sujet?



6
votes

Le Documentation pour la règle SA1101 SA1101 en fait mentionne ceci:

Une violation de cette règle se produit chaque fois que le code contient un appel à un membre d'instance de la classe locale ou d'une classe de base qui n'est pas préfixé avec "ceci".

(emphase ajoutée par moi-même). Donc oui, la règle nécessite ceci. sur chaque accès à un membre d'instance, que ce membre soit dans la classe locale ou hérité d'une classe de base.


1 commentaires

Merci, c'est intéressé! Styecop ne montrera aucun message lorsque vous fogotez "ceci". préfixe pour les membres de la base.



5
votes

Si vous pensez aux règles d'héritage de l'objet, même si f1 () est réellement déclaré sur basoclass il est hérité par enfantClass Il est valide pour l'appeler comme this.f1 () . C'est ce que STYLECOP vous dit de faire. En préfixant l'appel avec Ceci , il devient sans ambiguïté que vous appelez le F1 () instance méthode de l'instance d'exécution actuelle de la classe.

En fait, appelez-le comme f1 () ou this.f1 () est en fait synonyme, mais la signification / l'intention devient plus claire lors de l'utilisation du préfixe.

Vous ne devez pas utiliser le préfixe ici (même si cela compilera) car f1 () n'est pas virtuel et étant remplacé dans EnfantClass < / code>. La seule raison d'utiliser le préfixe est lorsque vous avez remplacé un membre de la classe de base virtuelle et souhaitez appeler explicitement ce membre de la classe de base de l'élément primordial. Si vous avez utilisé réellement le préfixe sans f1 () être virtuel tout serait fonctionner réellement jusqu'à ce que vous fassiez f1 () Virtual et ajouté une substitution dans EnfantClass . À ce stade, tous les appels vers BASE.F1 () continueraient d'appeler BASECLASS.F1 () et non de la nouvelle substitution dans EnfantClass . < / p>


0 commentaires