C # foreach
LOOCS: Un défaut de conception menant à des problèmes de fermeture
L'utilisation d'expressions lambda ou de méthodes anonymes dans les boucles C # 'S foreach
peut créer des erreurs "Accès à la fermeture modifiée". La gestion du compilateur de la variable de boucle est un facteur clé de ce problème.
Le problème avec la portée variable
Contrairement à la plupart des langues, C # déclare la variable de boucle foreach
à l'extérieur le corps de la boucle. Cela signifie qu'une seule instance variable existe pour toute la boucle. Chaque itération met à jour cette variable unique, conduisant à un comportement inattendu lorsqu'il est utilisé dans les fermetures. Les fermetures capturent ensuite la valeur finale de la variable, et non la valeur de chaque itération.
Limitations de variables de boucle
Une autre limitation est que les variables de boucle foreach
ne sont pas accessibles en dehors de la portée de la boucle. Ceci est incompatible avec la façon dont les variables de boucle se comportent généralement dans d'autres langues et obligent les développeurs à utiliser des solutions de contournement s'ils ont besoin de la valeur de la variable une fois la boucle terminée.
Pourquoi cette conception?
La spécification C # initiale était ambiguë sur la portée de foreach
Variables de boucle. Lorsque le support de fermeture a été ajouté en C # 2.0, la décision de placer la variable à l'extérieur de la boucle (similaire aux boucles for
) a été prise. Cependant, cela s'est avéré problématique, contredisant le comportement attendu et provoquant des erreurs.
C # 5 de la solution
Reconnaissant ce défaut de conception, Microsoft l'a abordé en C # 5. En C # 5 et ultérieurement, la variable de boucle foreach
est désormais étendue dans Chaque itération. Cela garantit que les fermetures capturent une nouvelle instance de la variable pour chaque cycle de boucle, résolvant le problème "accès à la fermeture modifiée" et alignement C # avec des pratiques de programmation communes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!