one*_*mer 4 c# linq lambda closures
foreach(var category in categories) {
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}
Run Code Online (Sandbox Code Playgroud)
代码运行正常,但我category
在lambda表达式中使用的引用中收到了关于"访问修改后的闭包"的警告.
问题:在这种情况下是否有任何后果的警告?
这里的警告是因为您正在访问lambda category
闭包内的变量Where
.该值category
随每次迭代而变化,并且Where
是延迟执行的,因此它将看到当前值category
与lambda创建时的值.
在这种情况下你很可能.即使Where
是延迟评估,该AddRange
方法也是迅速的,并将迫使评估Where
完成.因此,该Where
方法将看到category
它期望的价值.
如果您想要删除警告,只需声明迭代变量的本地副本并将其捕获.
foreach(var category in categories) {
var localCategory = category;
a.AddRange(_db.Articles.Where(c => c.Categories.Contains(localCategory)));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1945 次 |
最近记录: |