Verwendung des Schlüsselworts "this" in formalen Parametern für statische Methoden in C #

286

Ich bin auf mehrere Instanzen von C # -Code gestoßen, wie die folgenden:

public static int Foo(this MyClass arg)

Ich konnte keine Erklärung dafür finden, was das thisSchlüsselwort in diesem Fall bedeutet. Irgendwelche Einsichten?

kpozin
quelle
10
Zusätzlich zur akzeptierten Antwort muss für C # -Erweiterungsmethoden die offizielle MSDN-Dokumentation gelesen werden .
Vulkanischer Rabe
4
Erweiterungsmethoden sind praktisch, aber wir müssen beim Erstellen / Verwenden Vorsicht walten lassen - sie können brechen! Zitat aus den Allgemeinen Richtlinien in der offiziellen MSDN-Dokumentation : "Im Allgemeinen empfehlen wir, Erweiterungsmethoden sparsam und nur dann zu implementieren, wenn dies erforderlich ist. ... Wenn Sie eine Erweiterungsmethode verwenden, um einen Typ zu erweitern, dessen Quellcode Sie nicht ändern können, sind Sie Gehen Sie das Risiko ein, dass eine Änderung in der Implementierung des Typs dazu führt, dass Ihre Erweiterungsmethode nicht mehr funktioniert. "
Krishna Gupta
Bedeutet das, dass dies möglich wäre? Weil ich danach suche.
facepalm42

Antworten:

274

Dies ist eine Erweiterungsmethode . Eine Erklärung finden Sie hier .

Mithilfe von Erweiterungsmethoden können Entwickler dem öffentlichen Auftrag eines vorhandenen CLR-Typs neue Methoden hinzufügen, ohne ihn unterordnen oder den ursprünglichen Typ neu kompilieren zu müssen. Erweiterungsmethoden helfen dabei, die Flexibilität der Unterstützung für "Enten-Typisierung", die heutzutage in dynamischen Sprachen beliebt ist, mit der Leistung und Validierung zur Kompilierungszeit stark typisierter Sprachen zu kombinieren.

Erweiterungsmethoden ermöglichen eine Vielzahl nützlicher Szenarien und ermöglichen das wirklich leistungsstarke LINQ-Abfrage-Framework ....

es bedeutet, dass Sie anrufen können

MyClass myClass = new MyClass();
int i = myClass.Foo();

eher, als

MyClass myClass = new MyClass();
int i = Foo(myClass);

Dies ermöglicht den Aufbau fließender Schnittstellen wie unten angegeben.

Preet Sangha
quelle
Unterklassifizierung ist schwer
Gerry
@Gerry - was meinst du?
Preet Sangha
9
Entschuldigung, ein bisschen Sarkasmus - eine Menge Syntax scheint heutzutage Probleme zu lösen, von denen ich nicht einmal wusste, dass sie Probleme sind. Die Lesbarkeit sollte eine sehr hohe Priorität haben.
Gerry
2
Um ehrlich zu sein, klingt es so, als ob Sie sich in einem klassischen Blub-Paradoxon befinden . Heutzutage löst eine Menge Syntax Probleme, die Sie nicht haben, weil Sie nicht wussten, dass es einen besseren Weg gibt, oder Sie erledigen nicht die Art von Aufgabe, für die diese Syntax fantastisch ist. Die meisten Kommentare zu ' Dies ist eine Lösung auf der Suche nach einem Problem " sind tatsächlich ein Beispiel für " Ich weiß nicht, wie diese Funktion funktioniert, daher muss sie nutzlos sein ".
Myrddin Emrys
53

Scott Gu's zitierter Blog-Beitrag erklärt es gut.

Für mich ist die Antwort auf die Frage in der folgenden Aussage in diesem Beitrag:

Beachten Sie, dass die obige statische Methode vor dem ersten Parameterargument vom Typ string ein Schlüsselwort "this" hat. Dies teilt dem Compiler mit, dass diese bestimmte Erweiterungsmethode Objekten vom Typ "Zeichenfolge" hinzugefügt werden soll. Innerhalb der IsValidEmailAddress () -Methodenimplementierung kann ich dann auf alle öffentlichen Eigenschaften / Methoden / Ereignisse der tatsächlichen Zeichenfolgeninstanz zugreifen, für die die Methode aufgerufen wird, und true / false zurückgeben, je nachdem, ob es sich um eine gültige E-Mail handelt oder nicht.

James Wiseman
quelle
9
Dies sollte die akzeptierte Antwort sein. Dies ist die einzige Antwort, die tatsächlich erklärt, was der eigentliche Zweck des thisSchlüsselworts in der Methodensignatur ist. Die anderen Antworten sagen nur unbeholfen: "Es ist eine Erweiterungsmethode." Ich habe nie vollständig verstanden, wie Erweiterungsmethoden an die Typen "anhängen", die sie erweitern, bis ich diese Antwort gelesen habe. Danke dir!
Lews Therin
13

Zusätzlich zu Preet Sanghas Erklärung:
Intellisense zeigt die Erweiterungsmethoden mit einem blauen Pfeil an (z. B. vor "Aggregat <>"):

Geben Sie hier die Bildbeschreibung ein

Du brauchst ein

using the.namespace.of.the.static.class.with.the.extension.methods;

Damit die Erweiterungsmethoden angezeigt werden und verfügbar sind, wenn sie sich in einem anderen Namespace befinden als der Code, der sie verwendet.

Olivier Jacot-Descombes
quelle
4

Ich habe das neulich selbst gelernt: Das Schlüsselwort this definiert, dass die Methode eine Erweiterung der Klasse ist, die sie fortführt. In Ihrem Beispiel verfügt MyClass über eine neue Erweiterungsmethode namens Foo (die keinen Parameter akzeptiert und ein int zurückgibt. Sie kann wie jede andere öffentliche Methode verwendet werden).

jpoh
quelle
1

"this" erweitert die nächste Klasse in der Parameterliste

In der Methodensignatur unten erweitert "this" also "String". Die Zeile wird als normales Argument an die Methode an die Funktion übergeben. public static string [] SplitCsvLine (diese String-Zeile)

Im obigen Beispiel erweitert "diese" Klasse die eingebaute "String" -Klasse.

dcarl661
quelle