Ein paar Fragen zu Erweiterungsmethoden:
Warum sind Erweiterungsmethoden statisch?
Warum müssen sie in einer statischen Klasse deklariert werden?
Was bedeutet das Schlüsselwort this in der Parameterliste der Erweiterungsmethode? Da es sich um eine statische Klasse handelt, wie funktioniert das Schlüsselwort "this" in diesem Kontext?
Wie erfolgt die Speicherzuordnung für diese Art von Methoden?
Der einzige Unterschied zwischen einer statischen und einer nicht statischen Methode besteht darin, dass eine nicht statische Methode einen impliziten Parameter - this
- erhält. Erweiterungsmethoden werden nicht im Zusammenhang mit dem Objekt aufgerufen, für das die Methode deklariert wurde, daher gibt es keine Möglichkeit, ihnen die this
-Referenz zu übergeben, daher müssen sie statisch sein.
Sie können nicht das Schlüsselwort this
innerhalb einer Erweiterungsmethode verwenden, ich hoffe, dies beantwortet Ihre dritte Frage. Das Schlüsselwort this
in der Parameterliste gibt nur an, welchen Typ diese Methode erweitert.
Was ist Ihre Frage zur Speicherzuweisung? Eine Erweiterungsmethode ist wie jede andere statische Methode, nur die Aufrufsyntax ist anders.
Warum sind Erweiterungsmethoden statisch?
Weil Sie die Klasse zum Hinzufügen von Instanzmethoden nicht ändern können. Es ist alles syntaktische Zucker, um diese Methoden netter zu machen, nichts mehr.
Warum müssen sie in einer statischen Klasse deklariert werden?
Weil wir keine Instanzen der Klasse erstellen sollen. Es ist eine Designentscheidung. Warum komplizieren Dinge wie Instanzen einer Klasse, an die Erweiterungsmethoden angehängt sind, die möglicherweise nicht einmal verwendbar sind?
Was bedeutet das Schlüsselwort this in der Parameterliste der Erweiterungsmethode? Da es sich um eine statische Klasse handelt, wie funktioniert das Schlüsselwort "this" in diesem Kontext?
Es ist eine statische Methode. this
hat in diesem Zusammenhang keine Bedeutung. Die this
in der Signatur ist nur eine Möglichkeit zu bezeichnen, dass eine Erweiterungsmethode deklariert wird.
Wie erfolgt die Speicherzuweisung für diese Art von Methoden?
Verwirrt über diesen. Sie sind alle statische Methoden einer statischen Klasse. Sie werden wie jede andere (statische) Methode "zugewiesen", es gibt nur eine Kopie des Codes für den Typ.
Weil es keine Instanz gibt, um sie aufzurufen.
Ich denke, es ist die Anzahl der möglichen Fehler zu begrenzen, wenn es in nicht-statischen Klasse deklariert wurde.
Es sagt seine Erweiterungsmethode. Der Compiler sieht dies und erlaubt es, den Typ als deklariert zu verwenden, stattdessen als statische Methode.
Der Aufruf der Erweiterungsmethode ist nur syntaktischer Zucker. Dieser Aufruf wird in IL in einen normalen statischen Methodenaufruf konvertiert.
Die Antwort auf 1,2 und 4 ist ziemlich gleich. Erweiterungsmethoden sind einfach statische Methoden mit etwas speziellem syntaktischem Zucker. Dies:
%Vor%Ist effektiv die gleiche IL wie:
%Vor%Die frühere Methode erleichtert die Bereitstellung von IntelliSense-Unterstützung jedoch erheblich. Die Einschränkung der Klasse, die statisch sein muss, ist wahrscheinlich nur eine Designentscheidung oder vielleicht eine leistungsbezogene.
Die Antwort auf # 3 ist nur die Syntax, die die Sprachdesigner gewählt haben. C # -Entwickler sind daran gewöhnt, dass this
auf das Instanzobjekt verweist. Sie hätten es blah
nennen können, aber es wäre nicht so offensichtlich gewesen, was das Instanzobjekt ist.
Mit dem Schlüsselwort this in einer Erweiterungsmethode wird der C # -Compiler angewiesen, ihn mit dem ExtensionAttribute . Dieses Attribut wird von Benutzern der Assembly verwendet, um Erweiterungsmethoden zu finden.
Genau so sind sie definiert - mit diesem Schlüsselwort vor dem ersten Parameter, der die Instanz des Objekts ist, für das Sie die Methode aufrufen. Warum heißt ToString () ToString ()? Warum wird statisch für statisch verwendet? Warum ist das Gras grün? Ich schätze die Kräfte, die entschieden werden, um dies vor den ersten Parameter zu stellen, anstatt ein neues Schlüsselwort "extension" zu entwickeln, um es vor den Methodennamen zu setzen.
IL-generiert vom Compiler übersetzt Ihren Code in einen Aufruf der statischen Methode, obwohl die Syntax wie ein Aufruf für eine Instanzmethode aussehen könnte. Aber es ist nicht - es ist eine statische, die keinen Zugriff auf die privaten Mitglieder Ihres Objekts hat.
Tags und Links .net c# extension-methods