8
votes

Comment les méthodes d'extension sont implémentées en interne

Comment les méthodes d'extension sont-elles implémentées en interne? Je veux dire ce qui se passe lorsque le compilateur voit une déclaration pour une méthode d'extension et que se passe-t-il au moment de l'exécution lorsqu'il y a un appel à une méthode d'extension.

La réflexion est-elle impliquée? Ou lorsque vous avez une méthode d'extension, son code est injecté dans les métadonnées de type de classe cible avec quelques indicateurs supplémentaires notant qu'il s'agit d'une méthode d'extension, puis le CLR sait comment gérer cela?

Ainsi, en général, que se passe-t-il sous la hotte?


0 commentaires

7 Réponses :


4
votes

Les méthodes d'extension sont converties en fonctions statiques. En d'autres termes, ils sont sucres syntaxiques pour des fonctions statiques.


0 commentaires

2
votes

Je ne pense pas que réflexion est impliqué dans des méthodes d'extension. La méthode de l'extension est traitée de la même manière comme si vous écrivez une fonction statique dans un Classe d'assistance , la seule différence est que le compilateur le fait pour vous.


0 commentaires

1
votes

Pour clarifier la réponse ci-dessus ... Les méthodes d'extension sont des fonctions statiques. Les fonctionnalités supplémentaires de .NET 3.5 permettent d'être interprétées comme si elles sont de nouvelles méthodes sur le type en question.


0 commentaires

0
votes

Les méthodes d'extension ne sont que des méthodes statiques. La seule différence est apportée par des outils tels que l'éditeur Visual Studio qui les apparaît pour la fonctionnalité Auto complète (IntelliSense). Vous pouvez trouver une explication détaillée ici: C # Extension Méthodes: sucre syntaxique ou outil utile?


0 commentaires

0
votes

Les méthodes d'extension sont très telles que statiques avec la seule différence de celui-ci ayant un attribut compilerservices.extensionAttribute qui aide à l'identifier comme une méthode d'extension.

Vous pouvez Lire ce


0 commentaires

0
votes

Oui, les méthodes d'extension ne sont que des méthodes statiques. Ils n'ont pas de privilèges supplémentaires en ce qui concerne les classes qu'ils soi-disant «s'étendent». Cependant, le compilateur marque la méthode statique "extension" avec une extensionTtribute. Vous pouvez voir cela dans l'IL. Cela rend le compilateur le traiter spécialement, afin que vous ne puissiez pas l'appeler comme une méthode statique régulière. Par exemple, cela ne compilera pas:

var test = new [] { "Goodbye", "Cruel", "World" };
var result = IEnumerable<string>.Where<string>(test, s => s.Length > 5);


2 commentaires

Vous pouvez invoquer des méthodes d'extension directement sous forme de méthodes statiques, il s'agit simplement d'une méthode statique sur une classe statique différente: var résultat = énumérable.Where (test, S => S.Length> 5);


Vous avez absolument raison. Il n'a pas de sens d'essayer d'invoquer le type que vous «s'étendant». Ma faute.



9
votes

Comme déjà dit par d'autres collègues, il s'agit simplement d'une méthode statique. Il s'agit de tout au sujet du compilateur que nous pouvons dire que CLR n'a même aucune idée des méthodes de vulgarisation. Vous pouvez essayer de vérifier IL code ..

Voici un exemple P>

  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ldstr      "Hello World!!"
  IL_000d:  call       string StringPooling.ExtendedString::TestMethod(string,
                                                                       string)
  IL_0012:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0017:  nop


0 commentaires