繁体   English   中英

ToList()删除需要解决“访问修改后的关闭”resharper警告吗?

[英]Does ToList() remove need to address the “Access to Modified Closure” resharper warning?

我有以下代码:

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 closure问题。 但是不调用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()行为与保持关闭。 这很可能不会很快发生。

ReSharper无法告诉Find不会将lambda存储在全局某个地方以后再使用,所以无论如何它都会发出警告。

如果在parent变量更改后调用lambda表达式 - 在循环迭代之后,这只是一个问题。

如果调用ToList() ,则lambda仅在ToList()调用内使用。

如果不调用ToList() ,则每次枚举LINQ查询时都会使用lambda。
如果以后从未使用过该查询,则不需要ToList()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM