Je sais que .NET Lambda expressions peut capturer des variables extérieures. Cependant, je l'ai vu beaucoup de fois que les variables sont transmises explicitement à l'expression de Lambda en tant que paramètre et la bibliothèque .NET semble également supporter cela (par exemple, threadpool.Queueuerworkitem).
Ma question est que ce sont les limitations de ces captures? Qu'en est-il des lambdas qui sont réellement exécutés sur un fil différent de celui qu'ils ont été créés sur (par exemple, threadpool.QueuUserSerMorworkItem ou fil) ou des lambas qui agissent comme des rappels (c'est-à-dire invoqué ultérieurement)? P>
Généralement, quand devrais-je compter sur des variables capturées et quand utiliser des paramètres explicites? Par exemple: p> merci! P> update strong>: corrigé le deuxième exemple threadpool.QueueUserMeMItem. P> < / p>
3 Réponses :
Je pense dans votre premier exemple., vous voulez dire dans votre deuxième élément, où est le paramètre maintenant, ces deux travaillent tous deux de manière équivalente, mais p> Dans le premier cas: le paramètre
dans le second cas: Je dirais que le second cas est plus flexible par programmation, car il pourrait vous permettre théoriquement de modifier ultérieurement la valeur du paramètre code> message code> avant que la Lambda soit appelée. Cependant, la première méthode est plus facile à lire et est plus à l'abri des effets secondaires. Mais dans la pratique, les deux travaillent. P> p> s code> vient? Je pense que vous voulez dire p>
message code> est copié de la portée de
Ce
Dostuff code> méthode et stocké
directement dans votre expression de Lambda
lui-même, comme une fermeture. La Lambda a
Garde une copie du message
code>. p> li>
message code> est envoyé
à la queue code> code> et la file d'attente continue
le tira (avec la Lambda),
jusqu'à ce que la Lambda soit appelée. Il est
passé au moment de la course à
Lambda, à la Lambda. P> Li>
ul>
Vous avez raison, j'ai raté le paramètre dans la deuxième partie de l'exemple. Donc, si je comprends bien, dans la pratique, cela ne comporte pas vraiment lequel que j'utilise, mais que vous me recommanderiez d'aller avec des variables capturées, en raison de la simplicité (et de la lisibilité). Merci beaucoup pour votre réponse détaillée!
Pour votre exemple (une référence à un objet de chaîne immuable), il ne fait aucune différence.
et en général, une copie d'une référence ne va pas faire beaucoup de différence. Il est important de travailler avec des types de valeur: p> La première version n'est pas du thread-coffre-fort, le deuxième et le troisième pourrait être. p> La dernière version utilise le paramètre code> Etat d'objet code> une fonctionnalité FX2 (pré-linq). p> p>
Je dois admettre que je trouve votre exemple de code déroutant. Dans la première partie, vous utilisez le paramètre, mais vous ne le transmettez pas pour faire la Lambda. Mais cela n'utilise pas une variable capturée (par ma compréhension), car cela signifierait directement l'utilisation de la variable de valeur. Votre deuxième exemple souligne la manière dont les types immuables se comportent, qui va bien, mais cela ne m'aidait pas à comprendre la différence. Pourriez-vous mettre à jour votre réponse pour clarifier cela?
Merci, c'est clair maintenant. La seule chose est que vous devriez également mettre à jour les commentaires dans le code. +1 Pour mentionner la threadsafety (bien que cela ne fonctionne que avec des types immuables), mais j'ai accepté la réponse de Sanjay Manohar, car elle était plus rapide, claire et détaillée. Merci aussi pour votre aide!