web-dev-qa-db-fra.com

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

J'ai rencontré plusieurs exemples de code C # comme suit:

public static int Foo(this MyClass arg)

Je n'ai pas pu trouver d'explication sur la signification du mot clé this dans ce cas. Des idées?

260
kpozin

Ceci est une méthode d'extension . Voir ici pour un 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 ni à recompiler le type d'origine. Les méthodes d'extension permettent de combiner la flexibilité de la prise en charge du "typage de canard", couramment utilisée dans les langages dynamiques, avec la validation des performances et de la compilation des langages fortement typés.

Les méthodes d'extension permettent une variété de scénarios utiles et permettent de rendre possible le très puissant framework de requêtes LINQ ....

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 de interfaces fluides comme indiqué ci-dessous.

251
Preet Sangha

Le billet de blog cité de Scott G explique bien.

Pour moi, la réponse à la question se trouve dans la déclaration suivante de ce post:

Notez que 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 ensuite accéder à toutes les propriétés/méthodes/événements publics de l'instance de chaîne sur laquelle la méthode est appelée, et renvoyer true/false selon qu'il s'agit ou non d'un courrier électronique valide.

43
James Wiseman

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

enter image description here

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 de celui qui les utilise.

13

Ils sont méthodes d'extension . Bienvenue dans un tout nouveau monde fluide . :)

7
JP Alioto

Je viens de l'apprendre moi-même l'autre jour: le mot-clé this définit que cette méthode est une extension de la classe qui la produit. Ainsi, pour votre exemple, MyClass aura une nouvelle méthode d'extension appelée Foo (qui n'accepte aucun paramètre et retourne un int; elle peut être utilisée comme n'importe quelle autre méthode publique).

3
jpoh

"this" étend la classe suivante dans la liste de paramètres

Donc, dans la signature de méthode ci-dessous "ceci" étend "Chaîne". La ligne est transmise à la fonction en tant qu'argument normal de la méthode. public static string [] SplitCsvLine (cette ligne String)

Dans l'exemple ci-dessus, "cette" classe étend la classe "String" intégrée.

1
dcarl661