我应该关注linq查询中的“访问修改后的闭包”吗?

时间:2010-11-27 12:07:07

标签: c# linq

我有一个显示错误的linq查询:

alt text

如果集合的源是linq查询,我在任何时候尝试访问我正在迭代的变量时都会看到此错误。我想这个错误只是告诉我变量可能会改变,或类似的东西?

3 个答案:

答案 0 :(得分:20)

此错误告诉您,查询中的pubConfig引用将在评估查询时使用pubConfig 的值,而不是您定义它的时间并将其存储在pubConfigSettings

实际上,如果“在现场”评估查询,您就可以了。如果你保留它以供以后评估,同时pubConfig的值发生变化,你会遇到意想不到的结果。

答案 1 :(得分:11)

您正在关闭循环变量considered harmful。查询引用变量,而不是创建查询时变量的值。目前尚不清楚它是否会在您的特定代码示例中导致您出现问题(这取决于您对已创建的查询执行的操作),但通常您应该避免这种情况,因为它可能导致难以调试问题。

一个简单的解决方案是在查询中引用它之前获取循环变量的副本。

foreach (var pubConfig in ...)
{
    var pubConfig2 = pubConfig;
    // Use pubConfig2 instead of pubConfig in the query.
}

答案 2 :(得分:1)

只要变量在lambda的生命周期内没有被修改就没问题。

如果修改变量并再次使用lambda,则lambda将获得变量的新值,这可能会造成混乱甚至不是线程安全。

要消除警告,您可以在内部作用域中创建一个变量,从外部作用域复制变量并在lambda中使用它。