2010-09-07 2 views
8

StyleCop hat eine Regel zur Verwendung von "this". Präfix für aufrufende Klassenmitglieder (SA1101).C# StyleCop - Verwenden von "this". Präfix für Basisklassenmitglieder wie aktuelle Klassenmitglieder oder nicht?

Ist diese Regel für ein Member (z. B. eine Methode) einer Klasse gültig, die von ihrer Basisklasse geerbt wird.

Beispiel:

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? 
    } 
} 

Ich weiß, das nur für eine bessere Lesbarkeit ist.

+1

Nun, das hat geklopft, StyleCop auf meiner Prioritätenliste auszuprobieren. –

+0

@ Jon Hanna: Sie können konfigurieren, welche Regeln tatsächlich ausgeführt werden. Ich würde StyleCop nicht abwerten, bis Sie einen Blick darauf werfen und entscheiden, welche Regeln für Sie wichtig/nützlich sind. –

+0

@A.Karimi ist es nicht für die Lesbarkeit, tatsächlich verwenden ** Basis ** würde den Code lesbarer machen, es ist, Fehler zu vermeiden. Die Dokumentation hat eine gute Probe und Erklärung http://stylecop.soyuz5.com/SA1100.html –

Antwort

6

Die documentation for StyleCop Rule SA1101 tatsächlich erwähnt dies:

Eine Verletzung dieser Regel tritt auf, wenn der Code, um einen Anruf zu einer Instanz Mitglied enthält der lokalen Klasse oder eine Basisklasse, die nicht mit "vorangestellt ist, Dies.'.

(Hervorhebung von mir hinzugefügt). Also ja, die Regel erfordert this. bei jedem Zugriff auf ein Instanzmitglied, unabhängig davon, ob dieses Mitglied in der lokalen Klasse oder geerbt von einer Basisklasse ist.

+1

Danke, es interessiert sich! StyleCop zeigt keine Nachricht an, wenn Sie "dies" fogotten. Präfix für Basismitglieder. –

-3

Ich benutze gerne Base. base.F1() für Ihren Fall. Dadurch wird verhindert, dass versehentlich auf eine lokale Variable verwiesen wird, und es wird visuell daran erinnert, woher das Mitglied kam.

+0

Es ist schön, aber in diesem Fall werden wir eine andere Regel in stylecop (SA1100: Der Aufruf von GetItem sollte nur die 'Basis.' Präfix zu treffen Wenn das Element in der Basisklasse als virtuell deklariert ist und in der lokalen Klasse ein Override definiert ist, wird der Aufruf andernfalls mit dem Präfix vorangestellt. –

+0

Die Verwendung von "base" wäre sehr schlecht, wenn es nicht die Basismethode von ist die aktuelle virtuelle Methode, die Sie anrufen. Die Basismethode könnte virtuell gemacht werden, und Sie (oder jemand anders in der Hierarchie über Ihnen) möchte diese überschreiben, und dann würde Ihr Basisaufruf die falsche Methode aufrufen. – Timwi

+0

Das ist wirklich eine schlechte Übung. Sie sollten base nur verwenden, um anzugeben, dass Sie die Basismethode * anstelle von * einer in dieser Klasse definierten verwenden möchten. Es nirgends anders als in einem Override oder Hider zu nennen, ist bestenfalls zweitrangig. Es ist anfällig für Fehler und würde andere beim Betrachten des Codes verwirren, da sie es als vernünftig interpretiert interpretieren würden und verwirrt darüber sein könnten, warum sie die Override- oder Versteckmethode nicht finden konnten. –

0

Ich glaube, das ist richtig, da die Regel gilt für alle Methoden unabhängig davon, ob sie auf der Basis definiert sind oder nicht. Persönlich bin ich kein großer Fan dieser Regel, also deaktiviere ich sie einfach.

+0

Ich stimme dir zu, aber gibt es jemanden oder etwas wie stylecop, die das erklären? –

5

Wenn denken Sie über die Regeln für die Objektvererbung, obwohl F1() tatsächlich auf BaseClass erklärt wird es von ChildClass vererbt wird, so gilt es als this.F1() zu nennen. Das ist es, was StyleCop dir sagt. Durch Voranstellen des Anrufs mit this wird es unzweideutig, dass Sie die F1()Instanz Methode der aktuellen Laufzeitinstanz der Klasse aufrufen.

In der Tat, es als F1() oder this.F1() aufrufen sind eigentlich auch, aber die Bedeutung/Absicht wird klarer, wenn Sie das this Präfix verwenden.

Sie sollten das Präfix base hier überhaupt nicht verwenden (obwohl es kompiliert wird), da F1() nicht virtuell ist und in ChildClass überschrieben wird. Der einzige Grund für die Verwendung des Präfix base ist, wenn Sie ein virtuelles Basisklassenmitglied überschrieben haben und dieses Basisklassenmitglied explizit innerhalb des übergeordneten Elements aufrufen möchten. Wenn Sie tatsächlich das base Präfix ohne F1() virtuell alles würde tatsächlich funktionieren, bis Sie F1() virtuellen gemacht und eine Überschreibung in ChildClass hinzugefügt. An diesem Punkt würden alle Anrufe an base.F1() weiterhin BaseClass.F1() und nicht die neue Überschreibung in ChildClass aufrufen.