J'ai rencontré plusieurs instances de code C # comme suit:
public static int Foo(this MyClass arg)
Je n'ai pas pu trouver d'explication sur la signification du this
mot clé dans ce cas. Des idées?
J'ai rencontré plusieurs instances de code C # comme suit:
public static int Foo(this MyClass arg)
Je n'ai pas pu trouver d'explication sur la signification du this
mot clé dans ce cas. Des idées?
Réponses:
Il s'agit d'une méthode d'extension . Voir ici pour une explication .
Les méthodes d'extension permettent aux développeurs d'ajouter de nouvelles méthodes au contrat public d'un type CLR existant, sans avoir à le sous-classer ou à recompiler le type d'origine. Les méthodes d'extension permettent de combiner la flexibilité de la prise en charge du "typage canard" populaire dans les langages dynamiques d'aujourd'hui avec les performances et la validation au moment de la compilation des langues fortement typées.
Les méthodes d'extension permettent une variété de scénarios utiles et aident à rendre possible le cadre de requête LINQ vraiment puissant ....
cela signifie que vous pouvez appeler
MyClass myClass = new MyClass();
int i = myClass.Foo();
plutôt que
MyClass myClass = new MyClass();
int i = Foo(myClass);
Cela permet la construction d' interfaces fluides comme indiqué ci-dessous.
Le billet de blog cité par Scott Gu l' explique bien.
Pour moi, la réponse à la question se trouve dans la déclaration suivante dans ce message:
Notez comment la méthode statique ci-dessus a un mot-clé "this" avant le premier argument de paramètre de type chaîne. Cela indique au compilateur que cette méthode d'extension particulière doit être ajoutée aux objets de type "chaîne". Dans l'implémentation de la méthode IsValidEmailAddress (), je peux alors accéder à toutes les propriétés / méthodes / événements publics de l'instance de chaîne réelle sur laquelle la méthode est appelée, et retourner true / false selon qu'il s'agit d'un e-mail valide ou non.
this
mot - clé dans la signature de la méthode. Les autres réponses ne disent que de façon inutile "c'est une méthode d'extension". Je n'ai jamais entièrement compris comment les méthodes d'extension "se rattachent" aux types qu'elles étendent jusqu'à la lecture de cette réponse. Je vous remercie!
En plus de l'explication de Preet Sangha:
Intellisense affiche les méthodes d'extension avec une flèche bleue (par exemple devant "Aggregate <>"):
Tu as besoin d'un
using the.namespace.of.the.static.class.with.the.extension.methods;
pour que les méthodes d'extension apparaissent et soient disponibles, si elles se trouvent dans un espace de noms différent du code qui les utilise.
Ce sont des méthodes d'extension . Bienvenue dans un tout nouveau monde fluide . :)
Je viens de l'apprendre moi-même l'autre jour: le mot-clé this définit que la méthode est une extension de la classe qui la procède. Donc pour votre exemple, MyClass aura une nouvelle méthode d'extension appelée Foo (qui n'accepte aucun paramètre et retourne un entier; elle peut être utilisée comme avec n'importe quelle autre méthode publique).
"this" étend la classe suivante dans la liste des paramètres
Ainsi, dans la signature de méthode ci-dessous, "this" étend "String". La ligne est passée à la fonction comme argument normal à la méthode. chaîne statique publique [] SplitCsvLine (cette ligne de chaîne)
Dans l'exemple ci-dessus, "cette" classe étend la classe "String" intégrée.