令人想起过去的盗版现场滚石唱片的标题,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” lambda表达式的结尾处以“老式风格”关闭并处理它.