Maison > développement back-end > C++ > La réutilisation de la variable de boucle de C # de C # provoque-t-elle un comportement inattendu avec les lambdas?

La réutilisation de la variable de boucle de C # de C # provoque-t-elle un comportement inattendu avec les lambdas?

Barbara Streisand
Libérer: 2025-01-31 21:26:09
original
725 Les gens l'ont consulté

Does C#'s `foreach` Loop Variable Reuse Cause Unexpected Behavior with Lambdas?

c #

Réutilisation des variables de cycle: un problème laissé de l'histoire foreach Lorsque vous utilisez l'expression de lambda ou la méthode anonyme, la réutilisation de la variable cyclable

de C # peut causer des problèmes potentiels. Cette réutilisation conduira au problème de la "fermeture après modification", où toutes les expressions lambda dans le cycle font référence à la valeur finale de la variable, et non à la valeur actuelle de chaque itération.

foreach L'émergence de ce comportement spécial est dû au fait que la variable de circulation est déclarée en dehors du domaine circulant, comme le montre la conversion de code ci-dessous:

Bien que certaines personnes affirment que les variables déclarer en dehors du cycle n'apporteront pas des avantages de performance, il ne peut être utile d'y accéder qu'une fois le cycle terminé, mais cette méthode peut provoquer de graves erreurs en raison du problème de fermeture.
<code class="language-c#">string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}</code>
Copier après la connexion

Contrairement au cycle FOR, la portée variable de la boucle FOR est à l'intérieur du cycle. Cette incohérence augmente les risques d'erreur inutiles et rend le débogage difficile.

Bien que ce choix de conception puisse être fait avant l'introduction de l'expression de Lambda et des méthodes anonymes, elle n'a pas été modifiée et il apportera toujours des problèmes aux développeurs. foreach

Modifications majeures en C # 5

a reconnu ce défaut de conception, C # 5 a introduit un changement majeur pour le résoudre. Les variables circulaires agissent désormais logiquement à l'intérieur du corps du cycle. Cela signifie que la fermeture capturera la nouvelle copie de la variable à chaque itération, éliminant ainsi le problème de fermeture modifié.

Cependant, la boucle FOR restera inchangée et le changement ne sera pas retracé à la première version C #. Par conséquent, les développeurs devraient continuer à fonctionner attentivement lorsque vous utilisez le cycle

avec l'expression de Lambda ou la méthode anonyme. 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