4

resharper 让我将其设为局部变量,并写道“访问修改后的闭包”

if (filter != null)
{
    if (filter.CityId != 0)
    {
        ads = ads.Where(x => x.Ad.CityId == filter.CityId);
    }
    if (filter.BusinesCategoryId != 0)
    {
        ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId);
    }
}

为什么要做局部变量过滤?

4

2 回答 2

6

因为您的 query(Where(...)) 没有被执行。我假设过滤器是从循环中获得的?

Linq 查询在使用之前不会执行。因此,如果您循环了一堆过滤器,然后稍后开始执行它们,则查询中的过滤器值将是错误的。

一个类似的问题:也可以访问修改后的闭包:http : //devnet.jetbrains.net/thread/273042

需要查看更多代码才能 100% 确定。

于 2012-04-12T05:32:46.700 回答
3

根据我的理解,如果您从委托(闭包)访问变量,然后在执行委托之前修改变量,Resharper 将引发错误。如果您在委托/lambda 中访问 for 循环变量并在循环外执行它,这通常会发生。如果你的代码是这样的:

foreach (filter in filters)
{
      if (filter != null)  {
            if (filter.CityId != 0)      {
                ads = ads.Where(x => x.Ad.CityId == filter.CityId);
            }
            if (filter.BusinesCategoryId != 0)      {
                ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId);
            }
      }
} 
return ads.ToList()

那么它的行为就不会像你期望的那样。但是,如果您在循环范围内执行 lambda 表达式,那么您将没有问题。

我不会解释为什么它会这样,因为很多人已经很好地解释了它:

更新:回答“为什么要做局部变量?” 是因为上述问题的解决方法是使用局部变量(即在循环内部)并在您的 lambda 中使用它。这样,您就可以为每个 lambda 实例关闭变量的不同实例。

于 2012-04-12T06:01:39.730 回答