[英]Is LINQifying my code worth accessing a foreach variable in a closure?
让人想起过去的滚石乐队滚石乐队的唱片,Resharper比我以前更清晰; 因为我检查了我的代码,它告诉我关于闭包:
1)“循环:
foreach (var item in PlatypiIds)
{
var query = db.Table<Locations>().Where(l => l.PlatypusId == item).
Where(l=> l.SentTimeUTC >= EarliestToShow).
Where(l=> l.SentTimeUTC <= LatestToShow).
OrderBy(l => l.SentTimeUTC);
if (query != null)
{
foreach (var q in query)
{
listLocs.Add(q);
}
}
}
...可以转换为LINQ表达式:
listLocs.AddRange(from item in PlatypiIds select db.Table<Locations>().Where(l => l.PlatypusId == item).Where(l => l.SentTimeUTC >= EarliestToShow).Where(l => l.SentTimeUTC <= LatestToShow).OrderBy(l => l.SentTimeUTC) into query
where query != null from q in query select q);"
...但是后来Resharper告诉我关于“新的和改进的”代码:“在关闭时访问foreach变量。使用不同版本的编译器编译时可能会有不同的行为”
那么用不同版本的编译器编译的可能性有多大? 我的意思是,从VS2012到VS2010,我不打算倒退,例如... ???
2)在这些方面:
if (db != null)
db.Insert(new PlatypiRequested()
......这段代码:
using (var db = new SQLiteConnection(SQLitePath))
{
db.CreateTable<PlatypiRequested>();
db.RunInTransaction(() =>
{
if (db != null)
db.Insert(new PlatypiRequested()
{
PlatypusId = PlatypusId,
PlatypusName = PlatypusName,
InvitationSentLocal = invitationSentLocal
});
});
}
...... Resharper通知我,“获得处理关闭”
这是什么意思,我应该怎么做呢?
这里有两个不同的问题,一个是LINQ vs foreach,另一个是不同的情况。
关于ReSharper通知你在代码是LINQified时“在关闭时访问foreach变量...” - 我从不抓住机会,并将其作为foreach循环。 在大多数情况下,它也更具可读性和可维护性,而且实际上,缩短代码并不是什么大问题。
关于第二种情况 - 您将需要丢失using
语句,因为db
对象将很快被丢弃。 你应该将它关闭并以“旧学校时尚”的RunInTransaction
处理它内部的RunInTransaction
lambda表达式。
在foreach循环以及LINQ查询中会出现真正的差异。
它与定义变量的闭包(范围)的生命周期有关(在foreach循环或LINQ表达式中)。 在某些版本中,变量在循环的每次迭代中重新定义,而在其他情况下,它的生命周期跨越循环的整个执行,在迭代之间保持旧值。 这可能会对结果产生很大影响,具体取决于代码。
我无法解释它比Eric Lippert(在微软工作了16年,开发编译器,包括C#编译器)更好:
我确实看到过以不同方式运行的代码,具体取决于traget框架(因此也取决于C#版本)。 必须考虑到这一点。
大多数时候R#是正确的,就像在这个场合一样。
您可以使用Linq ForEach
删除开环。
db.Table<Locations>().Where(l => l.PlatypusId == item).
Where(l=> l.SentTimeUTC >= EarliestToShow).
Where(l=> l.SentTimeUTC <= LatestToShow).
OrderBy(l => l.SentTimeUTC).ToList().
ForEach(q => listLocs.Add(q));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.