Capture de fermeture incohérente de C# 5.0 : for
contre foreach
Le problème
C# 5.0 a amélioré la capture de fermeture dans les boucles foreach
, mais pas dans les boucles for
. Les boucles foreach
capturent désormais correctement la valeur de la variable de boucle pour chaque itération. for
les boucles, cependant, conservent l'ancien comportement, capturant uniquement la valeur finale de la variable de boucle.
La Question :Pourquoi cet écart ?
L'explication :
La différence vient de la structure fondamentale des boucles for
et foreach
. Une boucle foreach
parcourt intrinsèquement une collection, créant une nouvelle instance de la variable de boucle pour chaque élément. Cela rend la capture cohérente par itération simple.
Une boucle for
, en revanche, est plus complexe. Il se compose d'un initialiseur, d'une condition, d'un itérateur et d'un corps. L'initialiseur ne s'exécute qu'une seule fois, créant une seule variable de boucle. La valeur de la variable de boucle n'est pas intrinsèquement liée à chaque itération ; il peut être manipulé indépendamment dans le corps de la boucle.
Considérez :
<code class="language-csharp">for (int i = 0, j = 10; i < 5; i++, j--) { Console.WriteLine(i, j); }</code>
Si la variable de boucle i
était capturée à chaque itération, le comportement serait imprévisible et potentiellement ambigu en raison de la modification indépendante de j
. Le comportement cohérent de capture de la valeur finale de i
fournit un résultat clair et prévisible. Cela évite d’introduire des complexités inattendues et des bugs potentiels. Par conséquent, même si cela semble incohérent, la gestion différente dans C# 5.0 reflète les différences structurelles inhérentes entre les types de boucles et vise un comportement clair et prévisible dans chaque cas.
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!