2009-03-15 9 views
5

In C# können Sie mit dem Schlüsselwort 'this' auf Werte in einer Klasse verweisen.Sollten Sie immer auf lokale Klassenvariablen mit "this" verweisen

class MyClass 
{ 
    private string foo; 

    public string MyMethod() 
    { 
     return this.foo; 
    } 
} 

Während ich die Antwort likley sein Benutzerpräferenz vermuten, ist es am besten Praxis, die dieses Schlüsselwort innerhalb einer Klasse für lokale Werte zu benutzen?

Antwort

12

Im Geiste von DRY, würde ich sagen, dass dies im Allgemeinen keine besonders nützliche Praxis ist. Fast jede Verwendung von this kann durch Entfernen der this auf einen äquivalenten Ausdruck verkürzt werden.

Eine Ausnahme ist, wenn Sie einen lokalen Parameter haben, der denselben Namen wie ein anderes Klassenmitglied hat; In diesem Fall müssen Sie die beiden unter this unterscheiden. Aber das ist eine Situation, die Sie leicht vermeiden können, indem Sie einfach den Parameter umbenennen.

+0

Eine weitere Ausnahme ist die Verwendung einer Erweiterungsmethode innerhalb der Klasse, die erweitert wurde. Sie müssen dies verwenden. – Samuel

+0

Das stimmt. Wenn Sie die Klasse jedoch steuern, sollten Sie sich überlegen, ob Sie Erweiterungsmethoden verwenden möchten, und stattdessen nur Klassenmethoden verwenden. Und wenn Sie die Klasse nicht kontrollieren, können Sie nicht in diese (keine Wortspiel beabsichtigt) Situation geraten. –

+0

^^ guter Punkt. Die einzige Ausnahme ist, wenn Sie Erweiterungsmethoden verwenden, die * Schnittstellen * als Parameter akzeptieren. In diesem Fall sind Erweiterungsmethoden die einzige Option :-) –

1

Ich bevorzuge diese Syntax. Wenn die Klassen größer werden und die Funktionen komplexer werden, ist es praktisch, einen Variablennamen lesen zu können und zu wissen, ob es sich um eine Instanzvariable handelt, ohne auf einen anderen Teil des Codes verweisen zu müssen.

Edit: Mir ist klar, dass, wenn man Schwierigkeiten hat, Variablen im Auge zu behalten, es wahrscheinlich Zeit ist, umzuformen. Das ist in der Zusammenfassung in Ordnung. Also dann zu klären: in dem Fall, wo Klassen und ihre Beziehungen sind nicht einfach (und sicherlich gibt es sie) oder in Code, wo die Menschen nicht umstrukturiert oder gute Richtlinien für das Halten Parameter Namen von Instanz vars, ich werde sagen (imho!), dass die Verwendung von "this" keine schlechte Idee für klaren Code ist.

+0

Dies ist eine persönliche Vorliebe, aber IMO, wenn Sie "das" verwenden müssen. Als eine Krücke zum Verständnis einer komplexen Klasse könnte es an der Zeit sein, darüber nachzudenken, diese Klasse umzuformen. –

4

Ich verwende das this Stichwort fast nur, wenn einige Mitglieder ein anderes versteckt, und wenn ich die aktuelle Instanz der Klasse auf ein Verfahren zum Beispiel passieren müssen:

class Employee 
{ 
    private string name; 
    private string address; 

    // Pass the current object instance to another class: 
    public decimal Salary 
    { 
     get { return SalaryInfo.CalculateSalary(this); } 
    } 


    public Employee(string name, string address) 
    { 
     // Inside this constructor, the name and address private fields 
     // are hidden by the paramters... 
     this.name = name; 
     this.address = address; 
    } 


} 
3

Ich würde sagen, dass es auf persönliche Präferenz hängt für Ihre eigene Kodierung und die Team/Unternehmens-Kodierungsstandards für Ihren Code bei der Arbeit. Persönlich versuche ich, sowohl persönliche als auch "professionelle" Kodierungsstandards gleich zu halten - es reduziert Verwirrung, etc.

Ich bevorzuge "dieses" auf allen Funktionen und Variablen auf Klassenebene. Mit "this" können Sie sofort erkennen, ob der Gegenstand ein Klassenmitglied ist oder nicht. Außerdem bevorzuge ich die Verwendung von "base" für Member, die zu beliebigen Basisklassen gehören. Es ist nicht notwendig, aber es hilft Lesbarkeit, besonders wenn jemand, der nicht mit Ihrem Code vertraut ist, es liest.

1

Ich benutze es nie. Meistens ist es egal, ob eine Variable Mitglied ist oder nicht. Halten Sie Ihre Methoden klein genug, dass es kein Problem ist, sich zu erinnern, welche Variablen Einheimische sind, und Sie werden nicht so viel Mühe haben, sich zu erinnern, welche Mitglieder sind.

Ich verwende "_" als Präfix für Member-Variablen, da es leicht zu ignorieren ist. Aber das bedeutet, dass es nie zu einer Kollision mit einem lokalen Parameter kommen wird. ist nicht nötig.

Meine Einstellung kann durch die Tatsache "gefärbt" werden, dass ich ReSharper verwende, dessen "Color Identifiers" -Modus es mir leichter macht, zu sehen, was was ist.

1

Sie haben Recht - es ist sehr eine Präferenz Sache. Natürlich erzwingen viele Unternehmen eine Reihe von Richtlinien für den Codierungsstil, die entweder this vor einem Instanzmitglied erfordern oder verlangen, dass sie nicht angezeigt wird. (Weiß jemand, was die Microsoft FxCop-Regeln für das .NET-Framework sind?)

Persönlich, ich bevorzuge this erscheinen vor jeder Eigenschaft, Methode oder Feld, das zu einer Instanz gehört. Es macht es einfacher für mich zu unterscheiden, wo es hingehört:

  • Ein Mitglied einer Instanz der Klasse (mit dem Präfix this)
  • Ein statisches Klassenmitglied (die ich mit dem Namen der Klasse Präfix)
  • Ein lokaler Variable Umfang (kein Präfix)

es ist mehr wichtig für mich meinen Code in der Lage seine weniger zweideutig zu lesen, als es die 5 Zeichen von this. zu retten ist. Zum Beispiel weiß ich sofort, dass ich dispose() alle lokalen Bereich Elemente, die in diesem Bereich geöffnet werden müssen, und ich verwechsle sie nicht mit den Instanz-Mitglieder, die nicht entsorgt werden sollten. Verdammt, nur für zusätzliche Faulheitspunkte benutze ich this. als einen schnellen Weg, um auf die Intellisense-Liste von Mitgliedern der Instanzmitglieder zuzugreifen.

+2

Ich bevorzuge auch die Verwendung dieser 'Dies', 'Basis' und Klassennamen für die Statik - eine Gewohnheit entwickelt innerhalb von Microsoft in Projekten, wo FxCop Regeln es durchgesetzt - Blick auf den Code anderer Leute in diesen Tagen scheinen Mitglieder "nackt" ohne sie zu mich. –

1

In JavaScript ja! In Sprachen, in denen es nicht notwendig ist, nein. Einige Leute machen es, um die "Mitgliedschaft" für jemanden sichtbar zu machen, der den Code liest - aber Ihre IDE sollte sich darum kümmern können, indem Sie sie hervorheben.

Wenn VS 2010 herauskommt, ist mein Plan für Weltfrieden, eine Erweiterung für den WPF-Code-Editor zu schreiben, die this. vor jedem Verweis auf eine Elementvariable anzeigt, als dieses Präfix nicht bereits hat. Dann brauchen diejenigen, die diese Erinnerung brauchen, sie nicht mehr einzugeben, und diejenigen, die es nicht mögen, können meine Erweiterung einfach nicht installieren und können alle unnötigen this. Präfixe, die sie sehen, frei löschen.

+0

+1 auf Ihrer Erweiterung, vorausgesetzt, dass es zu diesem Zeitpunkt noch nicht in ReSharper ist. –

+0

Ich gebe diesen Jungs ungefähr eine Woche nach der ersten VS2010 Beta! :) –

0

Ich denke, dass Sie es immer einschließen sollten, wenn Sie sich speziell auf die Klassenvariable beziehen.

Der Grund dafür ist, wenn Sie später in eine lokale Variable mit dem gleichen Namen hinzufügen, müssen Sie alle Klassenvariablen mit this. umbenennen, also warum nicht sparen Sie Ihre Zukunft selbst einige Zeit und Ärger?

Verwandte Themen