Sollten wir beim Aufrufen einer Methode base.methodname und this.methodname verwenden?

8

In C # mit einem geerbten Klassensatz - sollten wir beim Aufrufen einer Methode die Schlüsselwörter 'base.methodname und this.methodname' verwenden ... unabhängig davon, ob es sich um eine überschriebene Methode handelt oder nicht?

Der Code wird wahrscheinlich Änderungen in Bezug auf die Logik erfahren, und möglicherweise treten zu einem späteren Zeitpunkt einige IF-ELSE-ähnliche Bedingungen auf. Zu diesem Zeitpunkt muss der Entwickler gezwungen sein, jede Codezeile erneut zu besuchen und sicherzustellen, dass er die richtige Wahl trifft, welche Methode aufgerufen wird --- base.methodname () oder this.methodname () ELSE the. Das NET-Framework ruft DEFAULT auf (ich denke, es ist base.methodname ()) und die gesamte Logik kann einen Wurf ausführen.

MukeshAnAlsoRan
quelle
Sie sollten Ihre Antwort als tatsächliche Antwort auf die Frage hinzufügen, anstatt sie in die Frage aufzunehmen.
Yannis
3
"Meine Antwort lautet: JA - es ist eine gute Praxis - verwenden Sie es, weil diese deshalb für erstellt wurden." Nach dieser Logik könnte ich auch sagen: "NEIN - es ist eine gute Praxis, die Verwendung dieser Schlüsselwörter ist aus einem bestimmten Grund optional."
pdr

Antworten:

27

Die Verwendung des baseSchlüsselworts ist keine Frage der Präferenz, sondern der Korrektheit. Wenn Sie die Basisklassenimplementierung in überschriebenen Methode aufrufen möchten, Sie müssen verwenden base. Wenn Sie das nicht aufrufen möchten, können Sie es nicht verwenden base.

Das thisSchlüsselwort hingegen ist in den meisten Fällen eine Frage der Präferenz. Ich denke, es macht den Code nur unnötig unübersichtlich, deshalb benutze ich ihn nicht, wenn ich nicht muss. Es ist nützlich, wenn Sie einen Methodenparameter mit demselben Namen wie Feld (oder Eigenschaft) haben. Ich würde thisin einem solchen Fall verwenden. Wenn ich jedoch neuen Code schreibe, verwende ich in der Regel Namenskonventionen, die dieses Problem vermeiden.

svick
quelle
Wenn ich Code nur für mich selbst schreibe oder dieser von mir oder einem anderen leitenden Entwickler gepflegt wird, werde ich ihn thiswie angenommen weglassen . Bei größeren Projekten, bei denen ich Nachwuchskräfte haben werde (möglicherweise sogar Neueinstellungen), verwenden wir diese Schlüsselwörter standardmäßig, damit der Umfang unabhängig von der Erfahrung des Programmierers sofort ersichtlich ist.
Joel Etherton
1
Hallo Joel ... deine Einstellung dazu stimmt genau mit meiner überein. Was wir arbeiten, ist ein alter C # -Code, der 2001 geschrieben wurde, und manchmal ist es ein Labyrinth da draußen. Auch morgen sind wir uns nicht sicher, wer der Entwickler nach ein paar Jahren sein würde (Auszubildender oder erfahrener). Wenn diese Schlüsselwörter verwendet werden und jemand überschriebene Methoden implementiert (aus Gründen des Polymorphismus), würde dieser Entwickler dies tun gezwungen sein, jeden Aufruf einer bestimmten Methode erneut zu besuchen, damit die Logik nicht fehlschlägt.
MukeshAnAlsoRan
Wenn ich eine Methode nicht überschreibe, warum kann ich sie dann nicht baseaufrufen, obwohl sie semantisch falsch ist?
Deduplikator
1
@JoelEtherton Ich halte es nicht für eine gute Idee, so auf den "kleinsten gemeinsamen Nenner" zu programmieren. Ich würde diese Begründung verstehen, wenn ich etwas wesentlich Komplexeres diskutiere, aber es thisist ungefähr so ​​grundlegend wie es nur geht. Wenn Programmierer den Umfang der Methoden (und den impliziten this.Zugriff von Objektmitgliedern, auch wenn sie nicht explizit geschrieben wurden) noch nicht verstehen , müssen sie lernen. Das liegt an ihnen .
Alexander - Reinstate Monica
1
@ JoelEtherton Ich würde im Allgemeinen zustimmen. Ich würde zum Beispiel mit C ++ - Template-Metaprogrammierung nicht verrückt werden. Ist thisaber wirklich grundlegend. Es wird erwartet, dass Sie jede Stufe der Programmierleiter kennen.
Alexander - Reinstate Monica
5

Ich würde vorschlagen, dass Sie ein ernstes Problem mit der Logik und der Lesbarkeit haben, wenn Sie explizit eine Basismethode aus einer Klasse aufrufen, in der diese Methode überschrieben wird. basesollte eigentlich nur dort erscheinen, wo die Basisimplementierung einer überschriebenen Methode von dieser überschriebenen Methode aufgerufen wird.

Überall sonst sollte es sein this(wenn die Methode nicht überschrieben wird, geht sie trotzdem in die Basisklasse) und es ist nichts Falsches daran, dem Compiler zu erlauben, darauf zu schließen.

pdr
quelle
0

thisSchlüsselwort: Es gibt keine feste Regel, um ein thisSchlüsselwort anzuwenden, da es eine persönliche Präferenz ist, aber Ihr Code könnte unübersichtlich werden.

Vor- und Nachteile der Verwendung dieses Schlüsselworts in C #

baseSchlüsselwort (Wiederverwendbarkeit): Es gibt bereits Antworten auf die Verwendung von base. Ich möchte einen Punkt hinzufügen.

Gemeinsame Funktionen für alle abgeleiteten Klassen werden in der Basisklasse bereitgestellt, und Sie können die Basismethode aufrufen, gefolgt von der spezifischen Implementierung in der Methode in der abgeleiteten Klasse, um die Wiederverwendbarkeit zu erreichen.

Karthik Sreenivasan
quelle
0

Zusätzlich können Sie "this" verwenden, wenn Sie eine Erweiterungsfunktion aufrufen.

public static class ExtensionForMyClass {  
public static void SomeFunction (this MyClass inst) {} 
}

Sie können nicht tun:

SomeFunction();

aus dem Inneren des MyClass-Körpers. Nur:

this.SomeFunction();

Es gibt keinen wirklichen Grund, statische Erweiterungen für die von Ihnen erstellte Klasse zu erstellen. Das einzige Szenario, in dem es für mich nützlich war, war, als ich Erweiterungsfunktionen hatte, die auf der Schnittstelle basierten, die meine Klasse implementiert, und nicht auf der Klasse selbst.

Iurii Selinnyi
quelle
0

Ich würde empfehlen, das this.Präfix zu löschen, außer in Fällen, in denen es Symmetrie hinzufügt. Z.B:

public class Foo: IComparable {
    int value1, value 2;

    public int CompareTo(object _that) {
        if (_that == null) return 1;
        if (Object.ReferenceEquals(this, _that)) return 0;

        Foo that = (foo) _that;
        var result = this.value1.CompareTo(that.value1)
        if (result != 0) return result;

        result = this.value2.CompareTo(that.value2)
        if (result != 0) return result;

        return 0
    }
}
Alexander - Monica wieder einsetzen
quelle