c# - LINQifying 我的代码是否值得在闭包中访问 foreach 变量?

标签 c# linq sqlite closures resharper

让人想起去年盗版滚石乐队现场录音的标题,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/

相关文章:

android - Android SQLiteDatabase 线程安全吗?

c# - 将外部页面加载到我的网页中更改布局

C# 如何为 WebRequest 伪造 IP 地址

c# - 使用 LINQ,您将如何从列表中过滤掉特定条件中除一项以外的所有项?

c# - SQLite 数据库与 C# 执行速度非常慢

Go SQlite 并发问题

c# - 4 个 System.Threading.Timers 中的 2 个未在服务器上启动,但在本地运行良好

c# - 如何在触摸屏中滚动 ListView

c# - 如何在 Entity Framework 6 的 linq 查询中使用 T-SQL Max

c# - WCF中如何通过LINQ获取Json数据?