Maison > développement back-end > C++ > Pourquoi la réutilisation de la variable de boucle C # foreach provoque-t-elle des problèmes 'accès à la fermeture modifiée'?

Pourquoi la réutilisation de la variable de boucle C # foreach provoque-t-elle des problèmes 'accès à la fermeture modifiée'?

Linda Hamilton
Libérer: 2025-01-31 21:16:10
original
585 Les gens l'ont consulté

Why Does C# Foreach Loop Variable Reuse Cause

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal