C# foreach
循环变量重用:一个历史遗留问题
在使用Lambda表达式或匿名方法时,C#的foreach
循环变量重用可能会导致潜在问题。这种重用会导致“修改后的闭包”问题,其中循环内的所有Lambda表达式都引用变量的最终值,而不是每次迭代期间的当前值。
这种特殊行为的出现是因为循环变量是在循环作用域之外声明的,如下面的代码转换所示:
<code class="language-c#">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>
尽管有人声称在循环外部声明变量不会带来性能优势,可能只对循环结束后访问它有用,但这种方法由于闭包问题可能导致严重错误。
与for循环不同,for循环的变量作用域在循环体内部,foreach
循环的变量会被重用,并且不能在循环外部访问。这种不一致性增加了不必要的错误风险,并使调试变得困难。
虽然这种设计选择可能是在引入Lambda表达式和匿名方法之前做出的,但它并没有被修改,并且仍然会给开发人员带来问题。
C# 5中的重大更改
承认了这个设计缺陷,C# 5引入了一个重大更改来解决它。foreach
循环变量现在会在逻辑上作用于循环体内部。这意味着闭包将在每次迭代时捕获变量的新副本,从而消除修改后的闭包问题。
然而,for循环将保持不变,并且更改不会追溯应用于早期C#版本。因此,开发人员在使用带有Lambda表达式或匿名方法的foreach
循环时,应继续谨慎操作。
以上是c#'s` foreach循环变量可重复使用会导致Lambdas的意外行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!