【发布时间】:2015-06-04 23:03:33
【问题描述】:
任何体面的编译器都应该eliminate dead code,至少在一定程度上是这样。但是,我很好奇编译器(特别是 MSBuild)如何处理如下情况:
// let's assume LazyLoadingEnabled = false;
var users = db.Users.ToList();
// more code that never touches 'users'
由于LazyLoadingEnabled = false,编译后的代码:
-
从数据库调用中快速加载结果
-
调用数据库而不存储结果
或
-
从不打电话?
我在工作中清理了一些旧代码,我发现了几个发生这种情况的案例,所以我很好奇我们是否一直在浪费资源。
感觉正确的答案是 3,但我还没有找到任何确凿的证据来支持我的说法。感谢您的帮助!
【问题讨论】:
-
调用
db.Users.ToList()并非没有副作用。该调用在上下文中创建User实体,因此即使不使用users,这些实体仍然可以使用。例如,如果随后使用相同的 dbContext 调用类似db.Users.Find()的内容,如果实体存在于本地,则该函数不会产生对数据库的调用。 -
@jjj 有趣。为了清楚起见,我应该删除
ToList()吗? -
我对此并不完全确定,但我认为在 DbContext 中引用 DbSet 属性可能会触发一些 DbContext 初始化,如果之前未初始化上下文。
标签: c# entity-framework msbuild dbcontext compiler-optimization