Il s'agit de la syntaxe de déclaration des méthodes d'extension, une nouvelle fonctionnalité de C # 3.0.
Une méthode d'extension est une partie code, une partie compilateur "magique", où le compilateur avec l'aide d'intellisense dans Visual Studio fait apparaître que votre méthode d'extension est réellement disponible comme méthode d'instance sur l'objet en question.
Laissez-moi vous donner un exemple.
Il n'y a pas de méthode sur la classe String nommée GobbleGobble, alors créons une méthode d'extension:
public static class StringExtensions
{
public static void GobbleGobble(this string s)
{
Console.Out.WriteLine("Gobble Gobble, " + s);
}
}
Le nom de la classe est juste ma convention de dénomination, il n'est pas nécessaire de le nommer comme ça, mais il doit être statique, tout comme la méthode.
Après avoir déclaré la méthode ci-dessus, vous pouvez, dans Visual Studio, taper ceci:
String s = "Turkey Baster!";
s.
après le point, attendez intellisense, et notez qu'il existe une méthode GobbleGobble, complétez le code comme ceci:
String s = "Turkey Baster!";
s.GobbleGobble();
Important : La classe dans laquelle la méthode d'extension est déclarée doit être disponible pour le compilateur et le processeur intellisense pour qu'intellisense affiche la méthode. Si vous tapez manuellement GobbleGobble et utilisez le raccourci Ctrl+ ., cela ne vous aidera pas à obtenir les bonnes directives d'utilisation dans le fichier.
Notez que le paramètre de la méthode a disparu. Le compilateur se déplacera silencieusement autour des bits importants, qui sont:
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
Ainsi, le code ci-dessus sera transformé par le compilateur en ceci:
String s = "Turkey Baster!";
StringExtensions.GobbleGobble(s);
Donc au moment de l'appel, il n'y a rien de magique, c'est juste un appel à une méthode statique.
Notez que si votre méthode d'extension déclare plus d'un paramètre, seul le premier prend en charge le this
modificateur, et le reste doit être spécifié dans le cadre de l'appel de méthode comme d'habitude:
public static void GobbleGobble(this string value, string extra)
{ | |
... | |
} | |
| |
+--------------------------------------------+ |
| |
v |
s.GobbleGobble("extra goes here"); |
^ |
| |
+-----------------------------------+
Les méthodes d'extension ont été ajoutées en partie à cause de Linq, où la syntaxe Linq de C # recherchera des méthodes d'extension correctement nommées pour les objets en jeu, ce qui signifie que vous pouvez "introduire" le support Linq dans n'importe quel type de classe en déclarant simplement la bonne extension méthodes. Bien sûr, la prise en charge complète de Linq demande beaucoup de travail, mais c'est possible.
De plus, les méthodes d'extension en elles-mêmes sont vraiment utiles, alors lisez-les.
Voici quelques liens: