c# - ReSharper 中修改的关闭警告

标签 c# .net resharper closures

我希望有人能向我解释这段代码中可能会发生什么坏事,这会导致 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)
);

最佳答案

在该特定代码中没有任何内容,以下面为例:

int myVal = 2;

var results = myDatabase.Table.Where(record => record.Value == myVal);

myVal = 3;

foreach( var myResult in results )
{
    // TODO: stuff
}

看起来 result 将返回值为 2 的所有记录,因为这就是您声明查询时 myVal 设置的值。但是,由于延迟执行,它实际上是值为 3 的所有记录,因为在您迭代查询之前不会执行查询。

在您的示例中,该值未被修改,但 Resharper 警告您它可能被修改并且延迟执行可能会给您带来问题。

关于c# - ReSharper 中修改的关闭警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2951037/

相关文章:

c# - 无锁更新中的 SpinWait

c# - XSLT 条件排序

javascript - 方法如何将 null 作为接口(interface)返回

c# - Resharper 的 "Object allocation (evident)"是什么意思?

c# - 未找到 Web Api Content.ReadAsAsync 方法,但代码编译

c# - 由于使用 Costura.Fody 的嵌入式程序集处理 deps.json

c# - 需要在值类型的对象中使用随机数生成器但不希望其依赖的负担

.Net:最先进的工具和框架

c# - 不安全的指针操作

c# - 如何将 DataGridView 定位到特定行(以便所选行位于顶部)