C # foreach
Réutilisation de la variable de boucle: Problèmes et solutions
C # Les expressions de lambda et les méthodes anonymes introduisent le problème de "fermeture modifiée" dans les boucles foreach
. Considérez cet exemple:
<code class="language-csharp">foreach (var s in strings) { query = query.Where(i => i.Prop == s); // Modified closure issue ... }</code>
Le code généré du compilateur révèle la racine du problème:
<code class="language-csharp">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>
La variable s
est déclarée à l'extérieur la boucle. Cette conception, bien que apparemment inoffensive au début, crée des problèmes. Il n'offre aucun avantage de performance et restreint l'utilisation variable en dehors de la boucle.
Pourquoi cette conception?
Cette réutilisation variable était un choix de conception au début de C # (1.0). La différence entre une variable intérieure et extérieure a été jugée insignifiante. Cependant, la sémantique de fermeture de C # 2.0 a changé cela. En maintenant la cohérence avec les boucles for
, la variable de boucle a été placée à l'extérieur.
Modifications en C # 5 et plus tard
Reconnaissant les défauts, C # 5 a introduit un changement de rupture: la variable de boucle foreach
est désormais logiquement à l'intérieur le corps de la boucle. Chaque itération obtient une nouvelle copie.
Cela résout le problème de la "fermeture modifiée", ce qui rend la méthode plus ancienne dangereuse. Il met également en évidence l'importance d'une utilisation prudente des mots clés, en particulier avec les lambdas ou les méthodes anonymes dans var
LOOCS. foreach
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!