为什么要做局部变量

本文关键字:局部变量 为什么 | 更新日期: 2023-09-27 18:30:54

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

为什么要过滤局部变量?

为什么要做局部变量

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

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

一个类似的问题:访问修改闭包另外: http://devnet.jetbrains.net/thread/273042

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

根据我的理解,如果您从委托(闭包)访问变量,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表达式,那么你就不会有问题。

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

  • 埃里克·利珀特的博客

  • 锐化警告 - 访问修改后的闭合

  • C# 在 foreach 中重用变量是否有原因?

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