【问题标题】:Why do local variable?为什么要做局部变量?
【发布时间】:2012-04-24 11:06:41
【问题描述】:

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

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

【问题讨论】:

  • 哪个局部变量,ads?

标签: c# linq filter


【解决方案1】:

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

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

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

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

【讨论】:

  • 有循环有危险吗?我不骑自行车。
  • 闭包可以在没有循环的情况下修改。循环是无意修改闭包变量的最常见原因,但不是唯一原因。
【解决方案2】:

根据我的理解,如果您从委托(闭包)访问变量,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 实例关闭变量的不同实例。

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2019-06-12
    • 2015-07-15
    • 2013-05-11
    • 1970-01-01
    • 2011-04-04
    • 2021-05-21
    • 2023-03-22
    • 2015-08-29
    相关资源
    最近更新 更多