2012-04-12 94 views
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); 
    } 
} 

为什么局部变量过滤器?

+2

哪个局部变量'ads'? – Tigran 2012-04-12 05:32:04

回答

6

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

直到它们被使用时才执行Linq查询。所以如果你通过一堆过滤器循环,然后开始执行它们,那么过滤器的值在查询中会出错。

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

需要看到更多的代码,以100%的把握。

+0

有一个周期是危险的吗?我不循环。 – Mediator 2012-04-12 06:38:57

+2

可以不用循环修改闭包。循环是无意修改的闭包变量的最常见原因,但它不是唯一的原因。 – phoog 2012-04-12 06:43:10

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实例的变量的不同实例。

相关问题