【发布时间】:2011-02-26 10:04:57
【问题描述】:
我希望有人能向我解释这段代码中可能发生的坏事,这会导致 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))
更新:附带说明,显然整个代码块可以转换为以下语句,这不会导致修改关闭警告:
return keys.Aggregate(
true,
(current, key) => current && ContainsKey(key)
);
【问题讨论】:
-
如果您愿意,可以将代码缩短为
result &= ContainsKey(key);。 -
@ChaosPandion:这不是位运算符吗? ...或者这与
bool无关吗? -
ChaosPandion 表示
result &&= ContainsKey(key); -
this 和其他几个的副本。
-
@adrianbanks:我可能应该搜索“修改后的关闭”;当我在提交表单中输入问题的标题时,我只是没有看到任何相同的问题。
标签: c# .net resharper closures