C # StyleCop - Das Präfix "this." für Basisklassenmitglieder wie aktuelle Klassenmitglieder oder nicht?

8

StyleCop hat eine Regel zur Verwendung von "this". Präfix für aufrufende Klassenmitglieder (SA1101).

Entspricht diese Regel einem Member (z. B. einer Methode) einer Klasse, die von ihrer Basisklasse geerbt wird.

Beispiel:

%Vor%

Ich weiß, dass dies nur der besseren Lesbarkeit dient.

    
Amir Karimi 07.09.2010, 22:24
quelle

4 Antworten

6

Die Dokumentation für die StyleCop-Regel SA1101 erwähnt dies tatsächlich:

  

Ein Verstoß gegen diese Regel tritt immer dann auf, wenn der Code einen Aufruf an ein Instanzelement der lokalen Klasse oder eine Basisklasse enthält, dem kein 'this' vorangestellt ist.

(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.

    
Timwi 07.09.2010, 23:22
quelle
5

Wenn Sie an die Regeln für die Objektvererbung denken, obwohl F1() tatsächlich für BaseClass deklariert ist, wird sie von ChildClass geerbt, so dass es gültig ist, sie als this.F1() zu bezeichnen. Das ist es, was StyleCop dir sagt. Durch Voranstellen des Aufrufs mit this wird es unzweideutig, dass Sie die Methode F1() Instanz der aktuellen Laufzeitinstanz der Klasse aufrufen.

Tatsächlich ist es tatsächlich synonym, sie als F1() oder this.F1() aufzurufen, aber die Bedeutung / Absicht wird klarer, wenn das this Präfix verwendet wird.

Sie sollten das Präfix base hier überhaupt nicht verwenden (obwohl es kompiliert wird), weil 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 Präfix base verwenden, ohne dass F1() virtuell ist, würde eigentlich funktionieren, bis Sie F1() virtuell erstellt und eine Überschreibung in ChildClass hinzugefügt haben. An diesem Punkt würden Aufrufe von base.F1() weiterhin BaseClass.F1() aufrufen und nicht die neue Überschreibung in ChildClass .

    
Scott Dorman 07.09.2010 23:30
quelle
0

Ich glaube, das ist richtig, da die Regel für alle Methoden gilt, 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.

    
Nathan 07.09.2010 22:30
quelle
-3

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

    
jwetzel1492 07.09.2010 22:29
quelle

Tags und Links