12
votes

Boucle à travers une liste d'actions

Je ne comprends pas comment boucler à travers une liste code> action code>. Lorsque je l'essaie, je me retrouve avec les valeurs étant identiques que l'itération précédente.

Voici le code (exemple simplifié): p> xxx pré>

sortie: p> >

abc
def
ghi


0 commentaires

3 Réponses :


19
votes

Votre action est une fermeture, il accède donc à str , pas une copie de str : xxx


3 commentaires

Gah, tu gagnes. Je savais comment le réparer, mais je ne me souvenais pas de la raison pour laquelle. Fermeture! J'ai besoin de fermeture! +1 :)


@Joshua Ce n'était pas trop longtemps quand j'ai appris dans un petit plus profond :) ... cela peut être bon pour la lecture supplémentaire Stackoverflow.com/questions/9412672/...


Intéressant, je n'ai jamais réalisé. Merci.



3
votes

C'est une situation assez compliquée. La réponse courte consiste à créer une copie de la variable locale avant de l'attribuer à la fermeture: xxx

Découvrez cet article sur les fermetures pour plus d'informations.


0 commentaires

6
votes

Ce comportement est conditionné par fermetures .

La variable présente dans votre Lambda est une référence référence et pas de copie de valeur non . Cela signifie que cela indique la dernière valeur supposée par str , qui est "ghi" dans votre cas. C'est pourquoi pour chaque appel, cela va juste à la même adresse mémoire la même valeur et récupère naturellement la même valeur.

Si vous écrivez le code, comme dans les réponses fournies, vous forcez un compilateur C # pour régénérer une valeur nouvelle à chaque fois, donc une nouvelle nouvelle L'adresse sera transmise à la Labmda, chaque Lambda aura donc propre variable.

Au fait, si je ne suis pas erreur, C # Équipe promet de corriger ce comportement non naturel dans C # 5.0 . Il est donc préférable de vérifier leur blog sur ce sujet pour les futures mises à jour.


1 commentaires

+1 Bonne explication. Il peut être utile de mentionner que Java le fait l'inverse. Si vous traitez avec Runnable (typiquement) pour démarrer un thread, les variables sont copiées dans le nouveau contexte. C'est aussi pourquoi Java vous oblige à les faire final .