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> sortie: p> > abc
def
ghi
3 Réponses :
Votre action est une fermeture, il accède donc à str code>, pas une copie de
str code>:
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.
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: Découvrez cet article sur les fermetures pour plus d'informations. P> P>
Ce comportement est conditionné par fermetures . p>
La variable présente dans votre Lambda est une référence Si vous écrivez le code, comme dans les réponses fournies, vous forcez un compilateur code> C # > pour régénérer une valeur forte> nouvelle forte> à chaque fois, donc une nouvelle Au fait, si je ne suis pas erreur, str code>, qui est "ghi" dans votre cas. C'est pourquoi pour chaque appel, cela va juste à la même adresse mémoire em> la même valeur et récupère naturellement la même valeur. P>
C # CODE> Équipe promet de corriger ce comportement non naturel em> dans
C # 5.0 code>. Il est donc préférable de vérifier leur blog sur ce sujet pour les futures mises à jour. P>
+1 Bonne explication. Il peut être utile de mentionner que Java le fait l'inverse. Si vous traitez avec Runnable code> (typiquement) pour démarrer un thread, les variables sont copiées i> dans le nouveau contexte. C'est aussi pourquoi Java vous oblige à les faire
final code>.