c# - ToList() 删除是否需要解决 "Access to Modified Closure"resharper 警告?

标签 c# .net resharper closures

我有以下代码:

foreach (var parent in parents)
{
    var children = data.Find<Order>(x=>x.ParentOrderId==parent.OrderId).ToList();
    // Do stuff with the children variable
}

Resharper 告诉我,我在父变量上有一个 Access to Modified 闭包问题。但是调用 ToList() 不是意味着它会立即被评估吗?

这是否否定了这样做的必要性?

foreach (var parent in parents)
{
    var parentClosure = parent;
    var children = data.Find<Order>(x=>x.ParentOrderId==parentClosure.OrderId).ToList();
    // Do stuff with the children variable
}

最佳答案

这就是为什么“访问修改后的闭包”只是一个警告,而不是一个错误。基本上,只要该闭包(对它的任何引用)无法逃脱循环体的一次迭代,就可以了。

因为,正如您提到的,.ToList()评估持有闭包的 IEnumerable,你没问题,这个警告确实是无害的,你可以安全地通过评论禁止它。

为了让 ReSharper 知道此警告何时严重,它不仅必须对闭包执行逃逸分析,还必须知道 Find<T> 是如何发生的。和 .ToList()保持闭包的行为。这可能不会很快发生。

关于c# - ToList() 删除是否需要解决 "Access to Modified Closure"resharper 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8329649/

相关文章:

c# - 冗余 ToString 代码?

refactoring - 抑制字符串中的 resharper 重命名

c# - 解决 caSTLe windsor 中的依赖项时如何将一种类型转换为另一种类型

c# - IIS 日志中的 WebAPI 路由

c# - 检查对象是否为值类型的最有效方法

c# - 关于using语句的一些高级问题

asp.net - 无效的 resx 文件。找不到文件 ..\..\My Project\Resources.resx

c# - 处理预期的异常

c# - 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序

.net - 使用 ReSharper 在 .NET Core 中运行 NUnit 测试