LINQify我的代码值得在闭包中访问foreach变量吗?

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

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能