Dies ist die Syntax zum Deklarieren von Erweiterungsmethoden, eine neue Funktion von C # 3.0.
Eine Erweiterungsmethode ist Teilcode, Teil-Compiler "magic", wobei der Compiler mithilfe von Intellisense in Visual Studio den Eindruck erweckt, dass Ihre Erweiterungsmethode tatsächlich als Instanzmethode für das betreffende Objekt verfügbar ist.
Lassen Sie mich ein Beispiel geben.
Es gibt keine Methode für die String-Klasse mit dem Namen GobbleGobble. Erstellen wir also eine Erweiterungsmethode:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
Der Klassenname ist nur meine Namenskonvention, es ist nicht notwendig, ihn so zu benennen, aber er muss statisch sein, ebenso wie die Methode.
Nachdem Sie die obige Methode deklariert haben, können Sie in Visual Studio Folgendes eingeben:
String s = "Turkey Baster!";
s.
Warten Sie nach dem Punkt auf Intellisense und stellen Sie fest, dass dort eine GobbleGobble-Methode vorhanden ist. Vervollständigen Sie den Code wie folgt:
String s = "Turkey Baster!";
s.GobbleGobble();
Wichtig : Die Klasse, in der die Erweiterungsmethode deklariert ist, muss dem Compiler und dem Intellisense-Prozessor zur Verfügung stehen, damit Intellisense die Methode anzeigen kann. Wenn Sie GobbleGobble manuell eingeben und die Verknüpfung Ctrl+ verwenden ., hilft es Ihnen nicht, mithilfe von Anweisungen in die Datei das Richtige zu finden.
Beachten Sie, dass der Parameter der Methode verschwunden ist. Der Compiler bewegt sich stillschweigend um die wichtigen Bits:
String s = "Turkey Baster!";
s.GobbleGobble();
^ ^
| +-- the compiler will find this in the StringExtensions class
|
+-- will be used as the first parameter to the method
Somit wird der obige Code vom Compiler folgendermaßen transformiert:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Zum Zeitpunkt des Anrufs ist also nichts Magisches daran, es ist nur ein Aufruf einer statischen Methode.
Beachten Sie, dass, wenn Ihre Erweiterungsmethode mehr als einen Parameter deklariert, nur der erste den this
Modifikator unterstützt und der Rest wie gewohnt als Teil des Methodenaufrufs angegeben werden muss:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
Erweiterungsmethoden wurden teilweise aufgrund von Linq hinzugefügt, bei dem die Linq-Syntax von C # nach entsprechend benannten Erweiterungsmethoden für die im Spiel befindlichen Objekte sucht. Dies bedeutet, dass Sie die Linq-Unterstützung in jede Art von Klasse "einführen" können, indem Sie einfach die richtige Erweiterung deklarieren Methoden. Natürlich ist die vollständige Unterstützung von Linq eine Menge Arbeit, aber es ist möglich.
Außerdem sind Erweiterungsmethoden für sich genommen sehr nützlich. Lesen Sie sie daher nach.
Hier sind ein paar Links: