C# 5.0 : Pourquoi for
les boucles ont manqué l'amélioration de la fermeture capturée
C# 5.0 a résolu le problème des variables de boucle capturées dans les foreach
boucles, garantissant que les variables de fermeture reflètent avec précision la valeur de la variable de boucle au moment de la capture. Cependant, cette amélioration n'a pas été appliquée aux boucles for
, qui conservent leur comportement d'avant la version 5.0.
La raison de l'omission
Cette exclusion intentionnelle découle de différences fondamentales entre les boucles for
et foreach
:
for
boucles : centrées sur l'initialisation. Une boucle for
commence par un initialiseur attribuant une valeur à la variable de boucle. Cette variable est centrale dans la logique de la boucle, modifiée et vérifiée à plusieurs reprises.foreach
boucles : basées sur un itérateur. foreach
les boucles reposent sur un itérateur fournissant des valeurs pour chaque itération. La variable de boucle agit comme un espace réservé, accédant à la valeur de l'itérateur.Dans les boucles for
, le concept d'une seule « instanciation de variable de boucle » s'aligne sur leur nature axée sur l'initialisation. Il existe une seule instance de variable de boucle logiquement cohérente, initialisée, mise à jour et contrôlant la fin de la boucle.
Considérez cette for
boucle :
<code class="language-csharp">for (int i = 0; i < 10; i++) { ... }</code>
Ici, i
gère le nombre d'itérations. Il est initialisé à 0, incrémenté à chaque itération et contrôle la fin de la boucle. Une fermeture capturant i
ferait intuitivement référence à une seule valeur, quels que soient les changements en boucle de i
. Cela contredit la dépendance de la boucle for
à l'égard du changement d'état de la variable.
À l'inverse, foreach
les boucles ne dépendent pas de l'état de la variable de boucle. Ils parcourent une collection sans avoir besoin d’une instance de variable spécifique. Ainsi, la fermeture capture la valeur de l'itérateur au moment de la capture, isolée des modifications ultérieures.
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!