为什么要做局部变量
本文关键字:局部变量 为什么 | 更新日期: 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 实例的变量的不同实例。