2009-05-09 6 views
22

Mögliche Duplizieren:
When do you use the “this” keyword?C# zu verwenden, wenn "das" Stichwort

Hallo, Ich verstehe, dass das This Schlüsselwort auf eine Instanz der Klasse zu bezeichnen ist, jedoch Angenommen, ich habe eine Klasse namens Life, die zwei Felder definiert, die Person (ihren Namen) und ihren Partner (ihren Namen) :

class Life 
{ 
    //Fields 
    private string _person; 
    private string _partner; 

    //Properties 
    public string Person 
    { 
     get { return _person; } 
     set { _person = value; } 
    } 

    public string Partner 
    { 
     get { return _partner; } 
     set { _partner = value; } 
    } 

    //Constructor 1 
    public Life() 
    { 
     _person = "Dave"; 
     _partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 

    //Constructor 2 
    public Life() 
    { 
     this._person = "Dave"; 
     this._partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 

Gibt es einen Unterschied zwischen Konstruktor 1 und Konstruktor 2? Oder ist es einfach besser Programmierpraxis, das "This" Schlüsselwort zu verwenden?

Grüße

+0

Dup: http : //stackoverflow.com/questions/23250/when-do-you-use-the-this-keyword –

+0

Dup: http://stackoverflow.com/questions/479322/what-is-the-proper-use-of -Keyword-this-in-private-class-Mitglieder –

+1

@Marc: Das ist kein Dup, es ist eine Reise ... ein Triplikat! : P – Cerebrus

Antwort

22

Die Konstrukteure sind die gleichen. Der Grund, warum ich die zweite bevorzugen würde, ist, dass Sie die Unterstriche aus Ihren privaten Variablennamen entfernen und den Kontext beibehalten können (was die Verständlichkeit verbessert). Ich mache es zu einer Praxis, immer this zu verwenden, wenn Sie auf Instanzvariablen und Eigenschaften verweisen.

Ich benutze das Schlüsselwort this nicht mehr auf diese Weise, nachdem ich zu einem anderen Unternehmen mit anderen Standards gewechselt bin. Ich habe mich daran gewöhnt und verwende es jetzt nur noch selten, wenn ich mich auf Instanzmitglieder beziehe. Ich empfehle immer noch die Verwendung von Eigenschaften (natürlich).

Meine Version Ihrer Klasse:

class Life 
{ 
    //Fields 
    private string person; 
    private string partner; 

    //Properties 
    public string Person 
    { 
     get { return this.person; } 
     set { this.person = value; } 
    } 

    public string Partner 
    { 
     get { return this.partner; } 
     set { this.partner = value; } 
    } 


    public Life() 
    { 
     this.person = "Dave"; 
     this.partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 

oder, noch besser, aber nicht so klar über die Verwendung von this mit Feldern.

class Life 
{ 

    //Properties 
    public string Person { get; set; } 
    public string Partner { get; set; } 

    public Life() 
    { 
     this.Person = "Dave"; 
     this.Partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 
+0

Also ist der Code ich einen älteren Weg dies getan? Und ist der Code, den Sie gepostet haben, der aktualisierte Weg, dies zu tun? Auch ..... Da Sie nur die Eigenschaften und nicht die Felder deklarieren, wie wird die Modifikatorstufe für die Felder festgelegt? oder wird es nur automatisch als privat festgelegt? – Goober

+4

Das letzte Beispiel verwendet automatische Eigenschaften, die in C# 3.0 (VS2008) eingeführt wurden. Zitat aus dem C# -Programmierhandbuch: "In C# 3.0 und höher machen automatisch implementierte Eigenschaften die Deklaration von Eigenschaften prägnanter, wenn in den Eigenschaftenaccessoren keine zusätzliche Logik erforderlich ist. Sie ermöglichen außerdem dem Clientcode das Erstellen von Objekten. Wenn Sie eine Eigenschaft wie angegeben deklarieren Im folgenden Beispiel erstellt der Compiler ein privates anonymes Backing-Feld, auf das nur über die get- und set-Accessoren der Eigenschaft zugegriffen werden kann. " Beispiel weggelassen. – tvanfosson

+0

Ich fühle mich mit dem 'this 'Schlüsselwort, wenn redundante Art und Weise zu verbose und macht nur den Code schwerer zu lesen. Es sollte offensichtlich sein, was Feld und was Einheimische sind. Wenn nicht, müssen Sie Dinge ausbrechen, so dass Sie kürzere Methoden haben. – vidstige

0

Sie diese zwischen einer lokalen Variablen mit dem Namen X und Klassenebene Feld/Eigenschaft des gleichen Namens unterscheiden verwenden können.

6

Es gibt keinen Unterschied in den beiden Aussagen ...

//These are exactly the same. 

this._person 

//and 

_person 

Der Verweis auf „das“ ist im Fall von _person impliziert. Ich würde nicht sagen, dass es notwendigerweise "bessere" Kodierungspraxis ist, ich würde sagen, dass es nur Präferenz ist.

+1

vereinbart auf den Punkt re: Präferenz –

+0

Yup. Es ist nichts falsch mit beiden Syntax. – BlackWasp

+1

Ich bevorzuge die Unterstreichungssyntax, weil sie kürzer ist und wie Brian sagte, der Unterstrich bedeutet "dieses" trotzdem. Der einzige Vorteil, den ich dem expliziten Benutzer von "this" geben würde, ist, dass, wenn es jemals ein Mehrdeutigkeits-Problem gibt, "dieses" es auflösen wird. In diesen Fällen neige ich dazu, "this" zu verwenden, um das Problem als Sonderfall zu lösen. –

0

Sie sollten die privaten Variablen _person und _parter nicht verwenden. Das ist der Zweck Ihrer Getter und Setter.

Soweit die Konstrukte, gibt es keinen wirklichen Unterschied zwischen ihnen. Davon abgesehen bevorzuge ich immer das This-Schlüsselwort, da es der Lesbarkeit dient.

3

Da Sie Unterstriche verwenden, gibt es keinen Konflikt zwischen den Namen; also ist die "this." redundant und kann weggelassen werden. Die IL wird nicht betroffen sein.

Solange zwischen einem Feld und einer Variablen/einem Parareter keine Zweideutigkeit besteht, gibt es nur ein Szenario, in dem das Schlüsselwort this (im Kontext der Bedeutung der aktuellen Instanz - nicht ctor-chaining) unbedingt notwendig ist Erweiterungsmethode, die separat definiert ist:

this.SomeExtensionMethod(); // works 
SomeExtensionMethod(); // fails 
+0

Ah, ich sehe es jetzt. Seltsam. Aber verständlich, da Erweiterungsmethoden immer in Verbindung mit einem expliziten Objekt aufgerufen werden. Ohne "this" würde es so aussehen, als ob Sie eine in der aktuellen Klasse deklarierte Methode aufrufen würden. Trotzdem sollte der Compiler in der Lage sein, eine solche Methode zu lösen ... oh well –

12

"this" ist auch in Net 3.5 mit Erweiterungsmethoden verwendet:

public static class MyExtensions 
{  
    public static string Extend(this string text) 
    { 
     return text + " world"; 
    } 
} 

der String-Klasse erstrecken würde

var text = "Hello"; 
text.Extend(); 

Um Ihre Frage zu beantworten: Nein, es gibt keinen Unterschied in Ihren beiden Konstruktoren. Imo, das "Dies" verstopft den Code und sollte nur bei Bedarf verwendet werden, z. wenn Parameter und Feldvariablen die gleichen Namen haben.

Es gibt auch einen Fall, wenn die Klasse explizit eine Schnittstelle implementiert. Wenn Sie die Interface-Methoden aus der Klasse aufrufen müssen würden Sie diese an die Schnittstelle werfen müssen:

class Impl : IFace 
{ 

    public void DoStuff() 
    { 
     ((IFace)this).SomeMethod(); 
    } 

    void IFace.SomeMethod() 
    { 
    } 
} 
+0

Re "du schlägst mich dazu"; eigentlich zeigen wir 2 verschiedene Dinge. Ich zeige die Verwendung von "this", wenn ich eine Erweiterungsmethode anrufe - nicht wenn ich eine definiere.Es ist eine Kuriosität, dass das "Dies" in solchen Fällen notwendig ist. –

+0

+1 Stimmen Sie zu, dass "dies" den Code stört und redundant ist. – Vadim

1

Beide Konstrukteure das gleiche tun sowieso in der zweiten die this redundant ist