C# 5.0:为什么 for
循环错过了捕获的闭包增强
C# 5.0 解决了 foreach
循环中捕获循环变量的问题,确保闭包变量准确反映捕获时循环变量的值。 但是,此改进并未应用于 for
循环,它保留了 5.0 之前的行为。
遗漏原因
这种有意的排除源于 for
和 foreach
循环之间的根本差异:
for
循环:以初始化为中心。 for
循环以初始化程序开始,为循环变量分配一个值。该变量是循环逻辑的核心,需要反复修改和检查。foreach
循环:基于迭代器。 foreach
循环依赖于为每次迭代提供值的迭代器。循环变量充当占位符,访问迭代器的值。在 for
循环中,单个“循环变量实例化”的概念与其注重初始化的性质相一致。 有一个逻辑上一致的循环变量实例,已初始化、更新并控制循环终止。
考虑这个for
循环:
<code class="language-csharp">for (int i = 0; i < 10; i++) { ... }</code>
这里,i
管理迭代计数。它被初始化为 0,每次迭代递增,并控制循环终止。 捕获 i
的闭包将直观地引用单个值,而不管 i
的循环内更改如何。这与 for
循环对变量变化状态的依赖相矛盾。
相反,foreach
循环不依赖于循环变量的状态。它们迭代集合而不需要特定的变量实例。 因此,闭包在捕获时捕获迭代器的值,与后续修改隔离。
以上是为什么 C# 5.0 捕获的闭包改进没有应用于'for”循环?的详细内容。更多信息请关注PHP中文网其他相关文章!