我希望有人可以向我解释这段代码中可能会发生什么不好的事情,这会导致 ReSharper 发出“访问修改的闭包”警告:
bool result = true;
foreach (string key in keys.TakeWhile(key => result))
{
result = result && ContainsKey(key);
}
return result;
即使上面的代码看起来安全,在其他“修改的闭包”实例中可能会发生什么不好的事情?我经常在使用 LINQ 查询时看到此警告,但我倾向于忽略它,因为我不知道会出现什么问题。 ReSharper 尝试通过创建第二个对我来说似乎毫无意义的变量来解决问题,例如它改变了foreach
上面一行到:
bool result1 = result;
foreach (string key in keys.TakeWhile(key => result1))
Update:附带说明一下,显然整个代码块可以转换为以下语句,这不会导致修改关闭警告:
return keys.Aggregate(
true,
(current, key) => current && ContainsKey(key)
);
在该特定代码中什么也没有,以以下为例:
int myVal = 2;
var results = myDatabase.Table.Where(record => record.Value == myVal);
myVal = 3;
foreach( var myResult in results )
{
// TODO: stuff
}
看起来结果将返回值所在的所有记录2
因为这就是您声明查询时 myVal 设置的值。然而,由于延迟执行,它实际上是值是的所有记录3
因为在您迭代查询之前,查询不会被执行。
在您的示例中,该值没有被修改,但 Resharper 警告您可能会被修改,并且延迟执行可能会给您带来问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)