C#在预见中重用变量有什么原因吗?在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()){
s = enumerator.Current;
...}var finalString = s;中定义的变量。foreach循环不能在循环之外使用:foreach(string s in strings){}var finalString = s; // won't work: you're outside the scope.因此,编译器声明变量的方式使它非常容易出错,而错误通常很难找到和调试,同时也不会产生任何可感知的好处。你有什么可以用的吗?foreach循环是这样的,如果它们是用内部作用域变量编译的,或者这只是在匿名方法和lambda表达式可用或通用之前所做的任意选择,而且从那时起就没有修改过?
3 回答
婷婷同学_
TA贡献1844条经验 获得超8个赞
for(;;)
int i
for (int i = 0; i < 10; i++)
?
foreach (var s in strings){ var s_for_closure = s; query = query.Where(i => i.Prop == s_for_closure); // access to modified closure
跃然一笑
TA贡献1826条经验 获得超6个赞
foreach (var s in strings){ query = query.Where(i => i.Prop == s); // access to modified closure
foreach (var s in strings){ string search = s; query = query.Where(i => i.Prop == search); // New definition ensures unique per iteration.
- 3 回答
- 0 关注
- 386 浏览
添加回答
举报
0/150
提交
取消