[英]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.