Les expressions de lambda fournissent un moyen concis de définir les fonctions en ligne dans une boucle. Cependant, l'utilisation de variables itératives directement dans les lambdas peut entraîner un comportement inattendu plus tard.
Trap lambda pour les variables itératives:
Considérez le code suivant:
for (int i = 0; i Console.WriteLine(i);
actions.Add(action);
}
foreach (var action in actions) {
action();
}
Les gens pourraient penser que chaque lambda imprimera la valeur correspondante de i. Cependant, tous les lambdas partagent la même référence de capture à I en raison de fermetures.
Résultat de l'impression accidentelle:
Lorsque la boucle sort, je deviens 10, et tous les lambdas pointent maintenant vers cette valeur finale. En conséquence, l'exécution de la Lambda imprimera "10" dix fois au lieu de la séquence attendue de 0 à 9.
Ce comportement découle de la fermeture de lambda maintient des références aux variables déclarées dans son étendue, même si la boucle a été terminée.
Méthodes d'évitement et alternatives:
]Pour résoudre ce problème, créez une variable locale dans la boucle et affectez-la à la valeur de la variable itérative:
for (int i = 0; i Console.WriteLine(j);
actions.Add(action);
}
foreach (var action in actions) {
action();
}
Cela garantit que chaque Lambda capture une valeur différente de J, résultant en la séquence d'impression attendue.
N'oubliez pas que l'utilisation de variables itératives directement dans les expressions de lambda peut conduire à des situations inattendues liées aux fermetures. Envisagez plutôt de créer des variables locales pour capturer avec précision les valeurs requises.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3