访问 lambda 表达式中的修改闭包

本文关键字:修改 闭包 lambda 表达式 访问 | 更新日期: 2023-09-27 18:23:36

foreach(var category in categories) {
    a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}

代码运行良好,但我收到有关"访问修改后的闭包"的警告,该警告引用了 lambda 表达式中使用的category

问题:在这种情况下,警告是否有任何后果?

访问 lambda 表达式中的修改闭包

这里的警告是因为您正在访问Where lambda 的闭包内的变量category。 值category每次迭代都会变化,并且Where执行延迟,因此它将看到当前值category与创建 lambda 时的值。

在这种情况下,您可能没事。 即使延迟评估WhereAddRange方法也会及时,并将强制完成Where的评估。 因此,Where方法将看到它期望category的值。

如果要删除警告,只需声明迭代变量的本地副本并捕获该副本即可。

foreach(var category in categories) {
  var localCategory = category;
  a.AddRange(_db.Articles.Where(c => c.Categories.Contains(localCategory)));
}

它告诉您"类别"变量处于闭包状态,并且可以在 LINQ 表达式外部进行修改。

看看这里的问题以获得一些解释。