9
votes

Pourquoi puis-je utiliser une expression Lambda à la place d'un délégué de rappel?

J'ai découvert une nouvelle syntaxe C # et ne comprends pas ce que cela signifie. Voici le code associé à la syntaxe:

1) xxx

2) xxx

Quelle est la signification de nouvelle action () et quelle est la signification du symbole =>

la syntaxe de threadpool.Queueuereworkitem était threadpool.QueuUserSerWorkItem (nouveau waiTcallback (impression), "bonjour"); mais ici, il affiche threadpool.queueuereworkItem (() => getqldata ()); , alors comment ça va ça marche? Pourquoi waiTcallback manque? S'il vous plaît expliquer en détail.

Merci beaucoup.


3 commentaires

() => Quelqu'un_code est une expression de Lambda et est juste un raccourci pour écrire des délégués anonymes. Je pense que votre confusion est causée par trop de façons d'obtenir la même chose.


@Pauli Østerø: Très bien dit :)


threadpool.QueueUeUserSerWorkItem (() => getqldata ()); ne compile pas dans mon application de test. Quelle version du fichier .NET est votre projet en utilisant (ou au moins, quelle version de VS)?


4 Réponses :


7
votes

regarder

délégué d'action

encapsule une méthode qui a un paramètre unique et ne renvoie pas un valeur. Vous pouvez utiliser l'action délégué à adopter une méthode en tant que paramètre sans déclarer explicitement un délégué personnalisé.

et

et Lambda Expressions (Guide de programmation C #)

Une expression lambda est un anonyme fonction qui peut contenir des expressions et des déclarations et peuvent être utilisés pour créer des délégués ou un arbre d'expression les types.

Toutes les expressions Lambda utilisent la Lambda opérateur =>, qui est lu comme "va à ". Le côté gauche de la Lambda L'opérateur spécifie l'entrée paramètres (le cas échéant) et le côté droit tient l'expression ou la déclaration bloquer. L'expression lambda x => x * x est lu "x va à x fois x."


0 commentaires

4
votes

Ceux-ci sont connus sous le nom de Expressions Lambda , qui ne sont pas très différent des délégués en C #.

Le () vide () Il n'y a pas d'arguments, et qu'est-ce que c'est entre le (facultatif) {} sont les corps d'expression Lambda. L'opérateur => associe simplement les deux expressions ensemble pour créer une expression Lambda. En côté, ils sont couramment trouvés dans le code Linq.

Il n'y a rien de spécial sur nouvelle action () , juste que c'est un Délégué qui peut mapper une expression de Lambda à elle-même.

comme pour threadpool.QueueUserSerWorkItem () , le waiTcallback argument est un délégué. Vous pouvez transmettre le nom d'un délégué nommé comme argument, transmettez un objet anonyme délégué ou écrire une expression lambda pour cet anonyme délégué (dans votre cas c'est () => Getqldata () ).


0 commentaires


6
votes

Comme d'autres l'ont dit, c'est une Lambda, qui est fondamentalement une fonction locale anonyme (Sans nom).

Cela pourrait avoir un peu plus de sens si vous regardez un code similaire qui n'utilise pas Lambdas: xxx

comme pour l'autre code, nous ne devrions normalement pas avoir à faire nouvelle action . Le problème est que la méthode begininvoke prend un délégué , qui est une sorte d'ancienne école et brise la façon dont la plupart des nouveaux codes fonctionnent.

avec le code plus récent (Cela prend quelque chose comme action ou un type spécifique de délégué, comme wairscallback ), vous écrivez une Lambda ou donnez simplement le nom d'une fonction à l'intérieur de votre classe. L'exemple de code que j'ai écrit ci-dessus montre les deux.

Notez également que si vous voyez quelque chose comme: (action) (() => bla ()) , il est joli Beaucoup de même que nouvelle action (() => bla ()) .


0 commentaires