4
C#在foreach中重用变量是否有原因?
在C#中使用lambda表达式或匿名方法时,我们必须警惕对修改后的闭包陷阱的访问。例如: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure ... } 由于修改了闭包,因此上述代码将导致Where查询中的所有子句都基于的最终值s。 正如解释在这里,这是因为该s变量在声明foreach环以上的编译器编译如下: string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... } 而不是像这样: while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... } 如此处所指出的,在循环外声明变量没有任何性能优势,在正常情况下,我能想到的唯一原因是如果您打算在循环范围外使用变量: string s; while (enumerator.MoveNext()) { …