Wann verwenden Sie das Schlüsselwort "this"? [geschlossen]


249

Ich war neugierig, wie andere Leute dieses Schlüsselwort verwenden. Ich neige dazu, es in Konstruktoren zu verwenden, aber ich kann es auch in der gesamten Klasse in anderen Methoden verwenden. Einige Beispiele:

In einem Konstruktor:

public Light(Vector v)
{
    this.dir = new Vector(v);
}

Anderswo

public void SomeMethod()
{
    Vector vec = new Vector();
    double d = (vec * vec) - (this.radius * this.radius);
}

2
Ich habe gute Beispiele gefunden, wenn Sie bei MSDN wirklich brauchen this . Bitte folgen Sie diesem Link ... ;-)
Matt

12
Wenn Sie jemanden verstehen und optimieren oder neu schreiben müssen, meistens schlecht geschriebenen Code, den Sie gerne hätten, thisoder einen anderen Qualifizierer, damit Sie auf einen einfachen Blick den Umfang der Variablen kennen (insbesondere ausgelassene Klassenqualifizierer für Konstanten (gleiches Paket oder) Hierarchie) oder super/ baseQualifizierer). Und die Verwendung der häufig verwendeten Syntax wie _fooscheint mir nicht so elegant zu sein. Das Drücken _auf Intellisense ist zeitaufwändiger als das Eingeben this. Und warum überhaupt die Mühe machen! Mit den automatischen Formatierungsfunktionen von Eclipse ist dies nicht erforderlich, _falls Sie das Qualifikationsmerkmal vergessen haben.
DJJJ

Nachdem ich die Antworten und Kommentare unten sowie die MSDN-Dokumentation gelesen habe : docs.microsoft.com/en-us/previous-versions/visualstudio/… zu diesem Schlüsselwort, das seit 6 Jahren nicht mehr aktualisiert wurde, würde ich vorschlagen Verwenden Sie dieses Schlüsselwort niemals . Es ist zwecklos. Machen Sie keine gleichnamigen Parameter, das ist verwirrend und dumm. Warum würdest du das tun? Übergeben Sie die Instanz auch nicht, wenn Sie dies verwenden , es ist auch verwirrend und dumm.
Yusha

Antworten:


218

Es gibt mehrere Verwendungen dieses Schlüsselworts in C #.

  1. Um Mitglieder zu qualifizieren, die unter einem ähnlichen Namen versteckt sind
  2. Damit sich ein Objekt als Parameter an andere Methoden übergibt
  3. Damit sich ein Objekt von einer Methode zurückgibt
  4. Indexer deklarieren
  5. Erweiterungsmethoden deklarieren
  6. Parameter zwischen Konstruktoren übergeben
  7. Um den Wert intern neu zuzuweisen, geben Sie den Wert (struct) ein .
  8. So rufen Sie eine Erweiterungsmethode für die aktuelle Instanz auf
  9. Sich auf einen anderen Typ zu werfen
  10. Zum Verketten von Konstruktoren, die in derselben Klasse definiert sind

Sie können die erste Verwendung vermeiden, indem Sie keine Mitglieds- und lokalen Variablen mit demselben Namen im Gültigkeitsbereich haben, z. B. indem Sie allgemeine Namenskonventionen befolgen und Eigenschaften (Pascal-Fall) anstelle von Feldern (Kamel-Fall) verwenden, um eine Kollision mit lokalen Variablen (auch Kamel) zu vermeiden Fall). In C # 3.0 können Felder mithilfe automatisch implementierter Eigenschaften einfach in Eigenschaften konvertiert werden .


49
8. Eine Erweiterungsmethode für die aktuelle Instanz aufrufen ( this.Foo();funktioniert, funktioniert aber Foo()nicht)
Marc Gravell

4
Um sich auch in einen anderen Typ umzuwandeln, wird beispielsweise eine explizit implementierte Methode wie aufgerufen ((ICollection<T>)this).Add(bla).
Nawfal

4
Verkettung der Konstruktion mit einem anderen Konstruktor, der im selben Typ definiert ist. public ClassName(...) : this(...).
Lasse V. Karlsen

1
@Anand es hat keinerlei Auswirkungen auf die Leistung zur Laufzeit. Unter der Annahme, dass keine Mehrdeutigkeit vorliegt, ist die Ausgabe des Compilers dieselbe, unabhängig davon, ob Sie beispielsweise this.someField = someValueoder schreiben someField = someValue. Dies könnte die Leistung des Compilers beeinträchtigen, da der Compiler den Quellcode anders analysiert, aber jeder Unterschied wäre sicherlich vernachlässigbar.
Phoog

7
Sie können das erste Problem vermeiden, indem Sie nur über Eigenschaften auf Felder zugreifen, wenn Sie eine Stilkonvention einhalten, bei der Eigenschaften nicht dieselben Namen wie Parameter haben können. Es kommt einfach vor, dass die vorherrschende Konvention im C # -Stil diese Anforderung erfüllt. Nicht alle C # sind jedoch unter dieser Konvention geschrieben. Eigenschaften an sich haben nichts an sich, was das thisSchlüsselwort unnötig machen würde . Ein aufgerufener Konstruktorparameter xverbirgt ein Element, das aufgerufen wird, xunabhängig davon , ob es sich bei dem Element um ein Feld, eine Eigenschaft oder ein Ereignis handelt.
Phoog

246

Ich meine nicht, dass das snarky klingt, aber es spielt keine Rolle.

Ernsthaft.

Schauen Sie sich die Dinge an, die wichtig sind: Ihr Projekt, Ihr Code, Ihr Job, Ihr persönliches Leben. Keiner von ihnen wird seinen Erfolg davon abhängen, ob Sie das Schlüsselwort "this" verwenden, um den Zugriff auf Felder zu qualifizieren. Das Schlüsselwort this hilft Ihnen nicht, pünktlich zu versenden. Es wird keine Fehler reduzieren, es wird keine nennenswerten Auswirkungen auf die Codequalität oder Wartbarkeit haben. Es wird Ihnen keine Gehaltserhöhung bringen oder Ihnen erlauben, weniger Zeit im Büro zu verbringen.

Es ist wirklich nur ein Stilproblem. Wenn Sie "dies" mögen, dann verwenden Sie es. Wenn nicht, dann nicht. Wenn Sie es benötigen, um die richtige Semantik zu erhalten, verwenden Sie es. Die Wahrheit ist, dass jeder Programmierer seinen eigenen Programmierstil hat. Dieser Stil spiegelt die Vorstellungen des jeweiligen Programmierers wider, wie der "ästhetisch ansprechendste Code" aussehen sollte. Per Definition hat jeder andere Programmierer, der Ihren Code liest, einen anderen Programmierstil. Das heißt, es wird immer etwas geben, das du getan hast und das der andere nicht mag oder anders gemacht hätte. Irgendwann wird ein Typ Ihren Code lesen und über etwas meckern.

Ich würde mich nicht darüber ärgern. Ich würde nur sicherstellen, dass der Code nach Ihrem Geschmack so ästhetisch wie möglich ist. Wenn Sie 10 Programmierer fragen, wie Code formatiert werden soll, erhalten Sie ungefähr 15 verschiedene Meinungen. Es ist besser, sich darauf zu konzentrieren, wie der Code berücksichtigt wird. Sind die Dinge richtig abstrahiert? Habe ich sinnvolle Namen für Dinge ausgewählt? Gibt es viele Codeduplikationen? Gibt es Möglichkeiten, wie ich Dinge vereinfachen kann? Ich denke, diese Dinge richtig zu machen, wird den größten positiven Einfluss auf Ihr Projekt, Ihren Code, Ihren Job und Ihr Leben haben. Zufälligerweise wird es wahrscheinlich auch dazu führen, dass der andere am wenigsten murrt. Wenn Ihr Code funktioniert, leicht zu lesen und gut berücksichtigt ist, wird der andere nicht prüfen, wie Sie Felder initialisieren. Er wird nur Ihren Code verwenden, sich über seine Größe wundern,


35
Das thisSchlüsselwort ist semantisch bedeutsam. Siehe den Kommentar von @ JasonBunting unten. Sie verwechseln die stilistische Überbeanspruchung thismit ihrem eigentlichen Zweck. Ihre Bemerkung ist nicht nur leichtfertig, sie ist auch falsch!
Dan Barowy

12
Wenn Sie eine Chance bekommen, möchten Sie vielleicht meine Antwort noch einmal lesen. Ich spreche davon, es in den Fällen zu verwenden, in denen es für die richtige Semantik notwendig ist. Vielleicht möchten Sie sich auch die Ursprungsfrage ansehen. Es zeigt die Verwendung in Beispielen, in denen dies semantisch nicht erforderlich ist. Ich bin mir also nicht sicher, was genau ich als "falsch" bezeichnet habe. Meine Antwort ist sicherlich nicht leichtfertig.
Scott Wisniewski

9
Weißt du, wie deine Antwort für mich klingt? Zwischen den Zeilen las ich "Wie kannst du es wagen, eine solche Frage zu stellen?" - Das ist meiner Meinung nach wirklich nicht konstruktiv. Niemand weiß alles - deshalb haben wir Stackoverflow: Um anderen zu helfen und Hilfe zu bekommen. Einige Themen kennen Sie, andere kennen andere. Helfen Sie sich gegenseitig, kämpfen Sie nicht miteinander. Bitte denken Sie darüber nach.
Matt

9
Ich will nicht snarky klingen, aber das ist eine der schlechtesten Antworten bisher. Ich sehe nicht, wie nützlich es ist, dies mit Ihrem Beruf oder Ihrem Privatleben zu vergleichen. Nur weil einige Dinge weniger wichtig sind als andere, heißt das nicht, dass sie unwichtig sind . Ein konsistenter Programmierstil ist nicht unwichtig (lesen Sie ein Buch über die Lesbarkeit / Wartbarkeit von Code Ihrer Wahl).
Aioobe

4
Ich denke, Sie haben meinen Standpunkt vielleicht falsch verstanden. Es war nicht so, dass "einen konsistenten Stil haben" schlecht ist. Ich sage nichts dazu. Es ist so, dass die op-Frage "sollte mein Styleguide dies vorschreiben". als Präfix für alle Feldzugriffe? " ist willkürlich und launisch.
Scott Wisniewski

96

Ich benutze es nur, wenn es absolut notwendig ist, dh wenn eine andere Variable eine andere beschattet. Wie hier:

class Vector3
{
    float x;
    float y;
    float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

Oder wie Ryan Fox betont, wenn Sie dies als Parameter übergeben müssen. (Lokale Variablen haben Vorrang vor Mitgliedsvariablen)


6
Warum geben Sie in diesem Fall den Eingabevariablen des Konstruktors nicht einfach unterschiedliche Namen?
wz366

54

Persönlich versuche ich immer zu verwenden , dies , wenn auf Membervariablen beziehen. Es hilft, den Code zu verdeutlichen und lesbarer zu machen. Selbst wenn es keine Mehrdeutigkeit gibt, weiß jemand, der meinen Code zum ersten Mal liest, das nicht, aber wenn er sieht, dass dies konsistent verwendet wird, weiß er, ob er eine Mitgliedsvariable betrachtet oder nicht.


9
aber wenn Sie vergessen, es irgendwann zu benutzen, werden sie verwirrt
surfen

2
@surfen, das durch zusätzliche Stilprüfungen vermieden werden kann, z. B. in Java können Sie Checkstyle verwenden und nach einem vollständigen Build ausführen (und in jeder gängigen iterativen / OO-Sprache gibt es ähnliche Tools)
Maarten Bodewes

5
@surfen, als ob Sie es in mehrdeutigen Fällen vergessen. Ich kann jedes Argument brechen, indem ich sage "aber wenn Sie vergessen ...".
Askolein

6
Die meisten Leute scheinen niemals den Code eines anderen zu lesen, zu optimieren oder neu zu schreiben! Qualifikanten sparen Zeit und Motivation! Ohne Qualifier ist es wie Magie, wenn Sie eine beliebige Codezeile sehen. Sie verschwenden also alle Zeit damit, einfach einzuchecken, woher diese Variablen stammen.
DJJJ

3
Ich weiß, dass dies ein sehr alter Beitrag ist, aber ich kann einfach nicht anders, als die Ironie dieser Antwort zu kommentieren (der ich zufällig zustimme). Im Dschihad gegen die böse ungarische Notation wurde jeder, der es wagte, seinen Mitgliedsvariablen "m_" voranzustellen, schnell angeprangert, weil die Unterscheidung von Mitgliedsvariablen einfach nicht nützlich oder notwendig war.
Michael J.

38

Ich benutze es jedes Mal, wenn ich auf eine Instanzvariable verweise, auch wenn ich es nicht brauche. Ich denke, das macht den Code klarer.


Ich möchte Klassenvariablen so weit wie möglich unterscheiden, damit der Code klarer wird. Ich habe das Präfix m_ (Mitgliedsvariable) verwendet, z. B. den privaten String m_name. Jetzt benutze ich dies nur zB wenn ich die Klasse Test {private string a; public someMethod () {this.a = "foo"; }}
Breitband

36

Ich kann nicht glauben, dass alle Leute, die sagen, es immer zu benutzen, eine "Best Practice" und so sind.

Verwenden Sie "this", wenn Unklarheiten bestehen, wie in Coreys Beispiel, oder wenn Sie das Objekt als Parameter übergeben müssen, wie in Ryans Beispiel . Es gibt keinen Grund, es anders zu verwenden, da die Fähigkeit, eine Variable basierend auf der Bereichskette aufzulösen, klar genug sein sollte, dass es nicht erforderlich sein sollte, Variablen damit zu qualifizieren.

BEARBEITEN: Die C # -Dokumentation zu "this" gibt neben den beiden genannten eine weitere Verwendung für das Schlüsselwort "this" an - zum Deklarieren von Indexern

EDIT: @Juan: Huh, ich sehe keine Inkonsistenz in meinen Aussagen - es gibt 3 Fälle, in denen ich das Schlüsselwort "this" verwenden würde (wie in der C # -Dokumentation dokumentiert), und dies sind Zeiten, in denen Sie es tatsächlich benötigen . "Dies" vor Variablen in einem Konstruktor zu halten, wenn keine Schattenbildung stattfindet, ist einfach eine Verschwendung von Tastenanschlägen und eine Verschwendung meiner Zeit beim Lesen. Es bietet keinen Vorteil.


21
@ JasonBunting : Du kannst manchmal etwas nicht tun und andere nicht ... es ist verwirrend ... Ich hoffe, ich arbeite nie in deinem Code. Du kannst nicht immer davon ausgehen, dass eine Person, die deinen Code in Zukunft liest, verstehen wird, was du bist geschrieben haben, müssen Sie so klar wie möglich sein, und ein Weg , um es zu erreichen ist , konsequent zu sein
juan

@ Juan, 10 Jahre später. Sie denken immer noch, dass dies eine gute Praxis ist? :)
Scott Adams

2
@ ScottAdams Ich glaube immer noch an Konsistenz und Klarheit, ja
Juan

Was ist mit der Bestimmung des Bereichs einer Variablen (ob es sich um eine lokale Variable oder eine Mitgliedsvariable handelt), indem Sie sie nur betrachten? Ist "das" nicht für diesen Zweck gerechtfertigt? Oder wollen Sie damit sagen, dass es ohnehin leicht genug ist, den Umfang der Variablen zu verstehen, wenn wir kleinere Methoden schreiben?
BornToCode

27

Ich benutze es immer dann , wenn StyleCop es mir sagt. StyleCop muss befolgt werden. Oh ja.


1
Und ReSharper sagt mir, ich soll es nicht benutzen. Etwas verwirrend, wenn ich sowohl StyleCop als auch ReSharper gleichzeitig verwende :) Aber ich lehne mich an Coreys Antwort oben an, um dieses Schlüsselwort nur dann zu verwenden, wenn es absolut notwendig ist.
Gunnar

@Gunnar, es gibt eine Option zum Deaktivieren der Beseitigung redundanter "dies". in R #
Flügelspieler Sendon

@ EmperorAiman ​​- Ja, ich weiß. Mein Punkt war, dass diese beiden gängigen Formatierungswerkzeuge standardmäßig zwei verschiedene Dinge vorschlagen und das kann verwirrend sein. "Sein oder
Gunnar

11

Immer wenn Sie einen Verweis auf das aktuelle Objekt benötigen.

Ein besonders praktisches Szenario ist, wenn Ihr Objekt eine Funktion aufruft und sich selbst an sie übergeben möchte.

Beispiel:

void onChange()
{
    screen.draw(this);
}

7

Ich neige dazu, es auch überall zu verwenden, nur um sicherzustellen, dass klar ist, dass es sich um Instanzmitglieder handelt, mit denen wir es zu tun haben.


5

Ich benutze es überall dort, wo es (offensichtlich) Unklarheiten geben könnte. Nicht nur die Mehrdeutigkeit des Compilers (in diesem Fall wäre dies erforderlich), sondern auch die Mehrdeutigkeit für jemanden, der sich den Code ansieht.


5

Eine andere, etwas seltene Verwendung für dieses Schlüsselwort ist, wenn Sie eine explizite Schnittstellenimplementierung innerhalb der implementierenden Klasse aufrufen müssen. Hier ist ein erfundenes Beispiel:

class Example : ICloneable
{
    private void CallClone()
    {
        object clone = ((ICloneable)this).Clone();
    }

    object ICloneable.Clone()
    {
        throw new NotImplementedException();
    }
}

4

Hier ist, wenn ich es benutze:

  • Zugriff auf private Methoden innerhalb der Klasse (zur Unterscheidung)
  • Übergeben des aktuellen Objekts an eine andere Methode (oder als Absenderobjekt im Falle eines Ereignisses)
  • Beim Erstellen von Erweiterungsmethoden: D.

Ich verwende dies nicht für private Felder, da ich privaten Feldvariablennamen einen Unterstrich (_) voranstelle.


4

[C ++]

Ich bin mit der Brigade "benutze es, wenn du musst" einverstanden. Dekorieren Code unnötig mit diesem ist keine gute Idee , da der Compiler benachrichtigt Sie nicht , wenn Sie vergessen , es zu tun. Dies führt zu potenzieller Verwirrung für Menschen, die erwarten, dass dies immer da ist, dh sie müssen darüber nachdenken .

Also, wann würden Sie es verwenden? Ich habe mich gerade in einem zufälligen Code umgesehen und diese Beispiele gefunden (ich kann nicht beurteilen, ob dies gute Dinge sind oder nicht):

  • "Sich" an eine Funktion übergeben.
  • Zuweisen von "sich selbst" zu einem Zeiger oder ähnlichem.
  • Casting, dh Up / Down-Casting (sicher oder anderweitig), Wegwerfen von Konstanz usw.
  • Vom Compiler erzwungene Begriffsklärung.

3

Sie sollten es immer verwenden, ich verwende es, um private Felder und Parameter zu unterscheiden (da unsere Namenskonventionen besagen, dass wir keine Präfixe für Mitglieds- und Parameternamen verwenden (und sie basieren auf Informationen, die im Internet gefunden wurden, daher denke ich, dass a beste Übung))


3

Ich benutze es , wenn in einer Funktion , die einen Verweis auf ein Objekt des gleichen Typs akzeptiert, ich es machen will , ganz klar , welches Objekt beziehen ich mich auf, wo.

Beispielsweise

class AABB
{
  // ... members
  bool intersects( AABB other )
  {
    return other.left() < this->right() &&
           this->left() < other.right() &&

           // +y increases going down
           other.top() < this->bottom() &&
           this->top() < other.bottom() ;
  }
} ;

(vs)

class AABB
{
  bool intersects( AABB other )
  {
    return other.left() < right() &&
           left() < other.right() &&

           // +y increases going down
           other.top() < bottom() &&
           top() < other.bottom() ;
  }
} ;

Auf einen Blick, auf den sich AABB bezieht right()? Das thisfügt ein bisschen einen Klärer hinzu.


3

In Jakub Šturcs Antwort könnte seine Nummer 5 über die Weitergabe von Daten zwischen Konstrukteuren wahrscheinlich eine kleine Erklärung gebrauchen. Dies ist beim Überladen von Konstruktoren der Fall, in dem die Verwendung von thisobligatorisch ist. Im folgenden Beispiel können wir den parametrisierten Konstruktor vom parameterlosen Konstruktor mit einem Standardparameter aufrufen.

class MyClass {
    private int _x
    public MyClass() : this(5) {}
    public MyClass(int v) { _x = v;}
}

Ich habe festgestellt, dass dies gelegentlich eine besonders nützliche Funktion ist.


2

Ich habe mir angewöhnt, es in Visual C ++ großzügig zu verwenden, da dies IntelliSense auslösen würde, wenn ich die Taste '>' drücke, und ich bin faul. (und anfällig für Tippfehler)

Aber ich habe es weiterhin verwendet, da ich es praktisch finde, zu sehen, dass ich eher eine Mitgliedsfunktion als eine globale Funktion aufrufe.


1

Ich neige dazu, Felder mit _ zu unterstreichen, also muss ich das nie wirklich verwenden. Auch R # neigt sowieso dazu, sie weg zu überarbeiten ...


1

Ich verwende dies so ziemlich nur, wenn ich auf eine Typeigenschaft innerhalb desselben Typs verweise. Wie bereits von einem anderen Benutzer erwähnt, unterstreiche ich auch lokale Felder, damit sie erkennbar sind, ohne dass dies erforderlich ist .


1

Ich benutze es nur bei Bedarf, mit Ausnahme von symmetrischen Operationen, die aufgrund des Polymorphismus einzelner Argumente in Methoden einer Seite eingefügt werden müssen:

boolean sameValue (SomeNum other) {
   return this.importantValue == other.importantValue;
} 

1

[C ++]

Dies wird im Zuweisungsoperator verwendet, bei dem Sie die meiste Zeit seltsame (unbeabsichtigte, gefährliche oder nur Zeitverschwendung für das Programm) Dinge überprüfen und verhindern müssen, wie:

A a;
a = a;

Ihr Zuweisungsoperator wird geschrieben:

A& A::operator=(const A& a) {
    if (this == &a) return *this;

    // we know both sides of the = operator are different, do something...

    return *this;
}

1

this auf einem C ++ - Compiler

Der C ++ - Compiler sucht stillschweigend nach einem Symbol, wenn er es nicht sofort findet. Manchmal ist es meistens gut:

  • Verwenden Sie die Methode der Mutterklasse, wenn Sie sie in der untergeordneten Klasse nicht überladen haben.
  • Förderung eines Wertes eines Typs in einen anderen Typ

Aber manchmal möchte man einfach nicht, dass der Compiler es errät. Sie möchten, dass der Compiler das richtige Symbol und nicht ein anderes aufnimmt.

Für mich sind diese Zeiten, in denen ich innerhalb einer Methode auf eine Mitgliedsmethode oder eine Mitgliedsvariable zugreifen möchte. Ich möchte nur nicht, dass ein zufälliges Symbol aufgenommen wird, nur weil ich printfstattdessen geschrieben habe print. this->printfhätte nicht kompiliert.

Der Punkt ist, dass bei C-Legacy-Bibliotheken (§) vor Jahren geschriebener Legacy-Code (§§) oder was auch immer in einer Sprache passieren könnte, in der das Kopieren / Einfügen eine veraltete, aber immer noch aktive Funktion ist, die den Compiler manchmal auffordert, nicht zu spielen Witz ist eine großartige Idee.

Dies sind die Gründe, die ich benutze this.

(§) Es ist immer noch eine Art Rätsel für mich, aber ich frage mich jetzt, ob die Tatsache, dass Sie den Header <windows.h> in Ihre Quelle aufnehmen, der Grund dafür ist, dass alle Legacy-Symbole der C-Bibliotheken Ihren globalen Namespace verschmutzen

(§§) zu erkennen, dass "Sie einen Header einfügen müssen, das Einfügen dieses Headers jedoch Ihren Code beschädigt, weil ein dummes Makro mit einem generischen Namen verwendet wird", ist einer dieser russischen Roulette- Momente im Leben eines Codierers


1

'Dies.' hilft bei der Suche nach Mitgliedern in dieser Klasse mit vielen Mitgliedern (normalerweise aufgrund einer tiefen Vererbungskette).

Das Drücken von STRG + Leertaste hilft dabei nicht, da es auch Typen enthält. wo-als "das". schließt NUR Mitglieder ein.

Normalerweise lösche ich es, sobald ich das habe, wonach ich gesucht habe: aber das ist nur mein Stil, der durchbricht.

In Bezug auf den Stil entscheiden Sie, wenn Sie ein Einzelgänger sind; Wenn Sie für ein Unternehmen arbeiten, halten Sie sich an die Unternehmensrichtlinien (sehen Sie sich die Informationen in der Quellcodeverwaltung an und sehen Sie, was andere Personen tun). In Bezug auf die Verwendung zur Qualifizierung von Mitgliedern ist weder richtig noch falsch. Das einzig Falsche ist Inkonsistenz - das ist die goldene Regel des Stils. Lassen Sie die Nit-Picking andere. Verbringen Sie Ihre Zeit damit, über echte Codierungsprobleme nachzudenken - und natürlich über das Codieren -.


1

Ich benutze es jedes Mal, wenn ich kann. Ich glaube, es macht den Code lesbarer und besser lesbarer Code bedeutet weniger Fehler und mehr Wartbarkeit.


1

Wenn Sie viele Entwickler sind, die an derselben Codebasis arbeiten, benötigen Sie einige Coderichtlinien / -regeln. Wo ich arbeite, haben wir beschlossen, "dies" für Felder, Eigenschaften und Ereignisse zu verwenden.

Für mich ist es sinnvoll, dies so zu tun. Es erleichtert das Lesen des Codes, wenn Sie zwischen Klassenvariablen und Methodenvariablen unterscheiden.


0

Das hängt von dem Codierungsstandard ab, unter dem ich arbeite. Wenn wir _ verwenden, um eine Instanzvariable zu bezeichnen, wird "dies" redundant. Wenn wir _ nicht verwenden, neige ich dazu, dies zu verwenden, um Instanzvariable zu bezeichnen.


0

Ich benutze es, um Intellisense genau wie JohnMcG aufzurufen , aber ich gehe zurück und lösche "this->", wenn ich fertig bin. Ich folge der Microsoft-Konvention, Mitgliedsvariablen "m_" voranzustellen, daher wäre es nur überflüssig, sie als Dokumentation zu belassen.


0

1 - Allgemeine Java-Setter-Sprache:

 public void setFoo(int foo) {
     this.foo = foo;
 }

2 - Beim Aufruf einer Funktion mit diesem Objekt als Parameter

notifier.addListener(this);

0

Es gibt eine Verwendung, die in C ++ noch nicht erwähnt wurde und die nicht darin besteht, auf das eigene Objekt zu verweisen oder ein Mitglied von einer empfangenen Variablen zu unterscheiden.

Sie können thiseinen nicht abhängigen Namen in einen argumentabhängigen Namen innerhalb von Vorlagenklassen konvertieren, die von anderen Vorlagen erben.

template <typename T>
struct base {
   void f() {}
};

template <typename T>
struct derived : public base<T>
{
   void test() {
      //f(); // [1] error
      base<T>::f(); // quite verbose if there is more than one argument, but valid
      this->f(); // f is now an argument dependent symbol
   }
}

Vorlagen werden mit einem Zwei-Pass-Mechanismus kompiliert. Während des ersten Durchlaufs werden nur nicht argumentabhängige Namen aufgelöst und überprüft, während abhängige Namen nur auf Kohärenz überprüft werden, ohne die Vorlagenargumente tatsächlich zu ersetzen.

In diesem Schritt hat der Compiler, ohne den Typ tatsächlich zu ersetzen, fast keine Informationen darüber, was sein base<T>könnte (beachten Sie, dass die Spezialisierung der Basisvorlage sie in völlig andere Typen verwandeln kann, sogar in undefinierte Typen), sodass er lediglich davon ausgeht, dass es sich um einen Typ handelt . Zu diesem Zeitpunkt ist der nicht abhängige Aufruf f, der dem Programmierer nur natürlich erscheint, ein Symbol, das der Compiler als Mitglied derivedoder in eingeschlossenen Namespaces finden muss - was im Beispiel nicht vorkommt - und er wird sich beschweren.

Die Lösung besteht darin, den nicht abhängigen Namen fin einen abhängigen Namen umzuwandeln. Dies kann auf verschiedene Arten geschehen, indem der Typ, in dem es implementiert ist, explizit angegeben wird (- Durch base<T>::fHinzufügen von base<T>wird das Symbol abhängig, Tund der Compiler geht nur davon aus, dass es vorhanden ist, und verschiebt die eigentliche Prüfung für den zweiten Durchgang danach Argumentersetzung.

Der zweite Weg, viel sortierter, wenn Sie von Vorlagen erben, die mehr als ein Argument oder lange Namen haben, ist das Hinzufügen eines this->vor dem Symbol. Da die von Ihnen implementierte Vorlagenklasse von einem Argument abhängt (von dem sie erbt base<T>), this->ist sie argumentabhängig, und wir erhalten das gleiche Ergebnis: this->fWird in der zweiten Runde nach dem Ersetzen der Vorlagenparameter überprüft.


-2

Sie sollten "dies" nicht verwenden, es sei denn, Sie müssen unbedingt.

Es gibt eine Strafe, die mit unnötiger Ausführlichkeit verbunden ist. Sie sollten nach Code streben, der genau so lang ist, wie er sein muss, und nicht mehr.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.