让人想起去年盗版滚石乐队现场录音的标题,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,另一个是不同的情况。
当代码经过 LINQ 化时,关于 ReSharper 通知您“在闭包中访问 foreach 变量...”——我只是从不冒险,将其保留为 foreach 循环。在大多数情况下,它也更具可读性和可维护性,而且实际上,缩短代码并不是什么大问题。
关于第二种情况 - 您需要丢失 using
语句,因为 db
对象将很快被释放。您应该在 RunInTransaction
lambda 表达式的末尾以“老式方式”关闭并处理它。
关于c# - LINQifying 我的代码是否值得在闭包中访问 foreach 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713754/