2010-09-22 8 views
7

Ich bemerke, dass wenn Sie ein privates Mitglied in einer Klasse haben, können Sie auf es in den Klassenmethoden zugreifen, indem Sie nur auf seinen Namen verweisen. Sie müssen nicht sagen this.memberName, nur memberName funktioniert. Ist das Schlüsselwort this im Rahmen des Mitgliederzugriffs optional?Ist dieses Schlüsselwort optional, wenn auf Mitglieder in C# zugegriffen wird?

Ich sehe es ist nützlich, wenn Sie den Geltungsbereich klären möchten - wenn Sie 2 Variablen mit dem gleichen Namen haben. Gibt es einen anderen Grund, es beim Zugriff auf Mitglieder zu verwenden?

+2

Wenn der Compiler denkt nicht beschweren ich es sechs von einem halben ein Dutzend der anderen. – R0MANARMY

+6

Ja, es ist optional. Meiner Meinung nach macht die Überbenutzung von "this" den Code durcheinander. –

+1

mögliches Duplikat von [C#, wenn "dieses" Schlüsselwort zu verwenden] (http://stackoverflow.com/questions/843288/c-when-to-use-this-keyword) –

Antwort

12

Ja, es ist optional. Sie müssen es nur dann verwenden, wenn Sie über eine lokale Variable verfügen, die eine Elementvariable ausblendet, oder Sie möchten auf eine indexed property (aka indexer) verweisen.

+2

Oder wenn Sie eine Erweiterungsmethode aufrufen möchten. –

+0

Das stimmt, aber es wird nicht so viele Situationen geben, in denen Sie das tun möchten. Wenn Sie Zugriff auf die Klasse haben, warum sollten Sie Erweiterungsmethoden darauf definieren?Der einzige Grund, an den ich denken kann, ist vielleicht in einer Klasse, die von IEnumerable erbt und Sie eine der in Enumerable definierten Erweiterungsmethoden verwenden möchten. –

0

Ja, "das" ist impliziert. Es kann manchmal für die Klarheit helfen. Und es ist auch notwendig, Methoden aufzurufen und auf die aktuelle Klasse verweisen zu müssen.

+2

Sie liegen falsch. Ich muss nicht "das" tippen. eine Methode von "dieser" Klasse aufrufen. – greenoldman

+1

Ich meinte, wenn Sie eine Methode aufrufen möchten, die auf die Mitglieder der aufrufenden Klasse verweist (d. H. "Referenziert die aktuelle Klasse"). Nicht nur um es anzurufen. –

1

Sie können optional this im Instanzmemberzugriff innerhalb eines Instanzmembers wie einer Instanzmethode oder -eigenschaft verwenden, da immer eine Instanzmethode this (bezogen auf das aktuelle Objekt) automatisch als unsichtbarer Parameter übergeben wird.

Sie können nicht this aus statischen Elementen verwenden, um beispielsweise Mitglied zugreifen ... wie Sie nicht this.x oder this.y (oder auch einfach x und y) von innerhalb einer statischen Methode oder Eigenschaft, wenn x und y-Instanz Mitglieder nutzen können. Dies liegt daran, dass this in einem statischen Member-Aufruf nicht definiert ist. Das statische Element gehört zur ganzen Klasse ... es hat keine Ahnung welche Instanz this sich bezieht. Und das liegt daran, dass der Aufruf beim Aufruf einer statischen Methode oder Eigenschaft das Format ClassName.MethodName(); hat. Die statische Methode weiß also nicht, welches Objekt this referenziert.

this ist auch nicht optional (es muss verwendet werden) als erster Modifikator in der Parameterliste einer Erweiterungsmethode. Tatsächlich identifiziert this eine statische Methode als eine Erweiterungsmethode. Hier identifiziert this den ersten Parameter als die Instanz, an der die Erweiterungsmethode arbeitet.

+0

das ist richtig, aber jeez es ist verwirrend:/ –

+0

Ich hoffe, der hinzugefügte Code wird das Konzept klären und Verwirrung beseitigen. Der Code wurde speziell entwickelt, um den Unterschied zwischen dem Zugriff auf Instanz und statische Member innerhalb von Instanzen und statischen Membern sowie den Fluss von "this" zu veranschaulichen. – explorer

0

"Dies" ist fast immer optional, wenn Sie Mitglieder der aktuellen Klasse aufrufen.

Es wird jedoch für andere Zwecke verwendet, z.B. Übergeben der aktuellen Klasseninstanz als Parameter oder Festlegen einer Eigenschaft, eines Felds oder einer Variablen für die aktuelle Instanz.

Der einzige Fall, in dem Sie es verwenden müssen, ist eine Methode aufrufen, wenn Sie eine Erweiterung Methode aufrufen:

class AClass { 
    void CallIt() { 
     Test();      //not valid 
     this.Test();    //valid 
    } 
} 
static class AnExtension { 
    public static void Test(this AClass source) { 

    } 
}