在 C# 5.0 之前的版本中,循环结构中的闭包捕获存在一个基本问题。在循环中声明的变量将被闭包捕获并保留其最终值,从而导致令人费解的结果。
虽然这个问题在 C# 5.0 中针对“foreach”循环已得到解决,但它在“for”循环中仍然存在。问题是:为什么这种不一致性得以保留?
答案在于“for”循环的基本性质。“foreach”循环与生俱来地意味着为每次迭代创建一个新变量,而“for”循环允许对变量初始化、条件检查和迭代进行更灵活的控制。
“for”循环的逻辑:
<code>{ initializer; while (condition) { body; iterator; } }</code>
可以看出,初始化阶段在逻辑上只发生一次,建立一个固定的初始值。然后在循环体中修改变量的值,并通过迭代器进行操作。
对闭包捕获的影响:
这种逻辑结构意味着只在闭包中捕获变量的一个实例是有意义的。在循环执行过程中,没有“起始”值或变量的逐步更新的固有概念。
与“foreach”循环的对比:
相比之下,“foreach”循环似乎为每次迭代声明一个新变量。该变量是只读的,强调了它在每次迭代中的独特性质。这种语义上的差异证明了为每次执行捕获一个单独变量的合理性。
保留“for”循环中变量捕获的遗留行为的决定源于这些循环结构提供的固有灵活性和控制性。现有行为与“for”循环的逻辑结构非常吻合,确保了结果的一致性和可预测性。
以上是为什么 C# 5.0 Foreach 和 For 循环表现出不同的捕获闭包行为?的详细内容。更多信息请关注PHP中文网其他相关文章!