为什么局部变量?

时间:2012-04-12 05:27:29

标签: c# linq filter

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);
    }
}

为什么局部变量过滤?

2 个答案:

答案 0 :(得分:6)

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

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

一个类似的问题:Access to Modified Closure 另外:http://devnet.jetbrains.net/thread/273042

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

答案 1 :(得分: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的每个实例关闭变量的不同实例。