Utilisation du mot-clé «this» dans les paramètres formels pour les méthodes statiques en C #

286

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 thismot clé dans ce cas. Des idées?

kpozin
la source
10
En plus de la réponse acceptée, pour les méthodes d'extension C #, il faut consulter la documentation MSDN officielle .
vulcan raven
4
Les méthodes d'extension sont pratiques mais nous devons faire preuve de prudence lors de leur création / utilisation - elles peuvent casser! Citation des directives générales dans la documentation MSDN officielle : "En général, nous vous recommandons d'implémenter les méthodes d'extension avec parcimonie et uniquement lorsque vous le devez. ... Lorsque vous utilisez une méthode d'extension pour étendre un type dont vous ne pouvez pas modifier le code source, vous courez le risque qu'un changement dans l'implémentation du type entraîne la rupture de votre méthode d'extension. "
Krishna Gupta
Est-ce à dire que cela serait possible? Parce que c'est ce que je recherche.
facepalm42

Réponses:

274

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.

Preet Sangha
la source
la sous-classification est difficile
Gerry
@Gerry - que voulez-vous dire?
Preet Sangha
9
Désolé, un petit sarcasme - beaucoup de syntaxe ces jours-ci semblent résoudre des problèmes que je ne connaissais même pas. La lisibilité devrait être une priorité très élevée.
Gerry
2
Pour être honnête @Gerry, on dirait que vous êtes dans un Blub Paradox classique . Beaucoup de syntaxe de nos jours résout les problèmes que vous n'avez pas parce que vous ne saviez pas qu'il y avait une meilleure façon ou que vous ne faites pas le genre de tâche pour laquelle cette syntaxe est géniale. La plupart des commentaires sur « c'est une solution à la recherche d'un problème » sont en fait un exemple de « je ne sais pas comment cette fonctionnalité fonctionne, elle doit donc être inutile ».
Myrddin Emrys
53

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.

James Wiseman
la source
9
Ce devrait être la réponse acceptée. C'est la seule réponse qui explique réellement quel est le but réel du thismot - 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!
Lews Therin
13

En plus de l'explication de Preet Sangha:
Intellisense affiche les méthodes d'extension avec une flèche bleue (par exemple devant "Aggregate <>"):

entrez la description de l'image ici

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.

Olivier Jacot-Descombes
la source
4

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).

jpoh
la source
1

"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.

dcarl661
la source