【发布时间】:2014-01-11 00:50:51
【问题描述】:
我有以下代码:
public void DequeueRecipe(AuthIdentity identity, params Guid[] recipeIds)
{
using (var session = GetSession())
{
var recipes = (from r in recipeIds select new Models.Recipes {RecipeId = r}).ToArray();
var dbRecipes = session.QueryOver<Models.QueuedRecipes>()
.Where(Expression.Eq("UserId", identity.UserId))
.Where(Expression.InG("Recipe", recipes))
.List<Models.QueuedRecipes>();
using (ITransaction transaction = session.BeginTransaction())
{
dbRecipes.ForEach(r => session.Delete(r)); // <-- Warning
transaction.Commit();
}
}
}
reSharper 给了我警告:
访问已处置的闭包
上线:
dbRecipes.ForEach(r => session.Delete(r));
(session 变量下划线是罪魁祸首)。
虽然ForEach 方法确实采用了在变量session 周围创建闭包的lamba 表达式,但我看不到在执行此代码时可能会释放它的方法。也许 reSharper 认为 ForEach 可能会并行执行某种任务,或者将 Action<> 保存到以后,因此从技术上讲,它可能会在匿名函数在内存中仍然可以访问时被释放。
忽略此警告是否安全?有没有办法可以重新格式化我的代码以防止出现此警告?这段代码确实存在危险吗?
我已经习惯了 reSharper 比我更聪明,所以我想确切地了解发生了什么。
【问题讨论】:
-
无关:事务开始/提交不是Delete()的责任吗?在事务之外执行 Delete() 是否可能/正确(假设它有多个操作 [表])?
-
@MitchWheat - 同意,我可以删除事务,因为它会在会话结束时全部提交。我一直在修改我的会话代码,所以这是我早期架构的残余。
-
当我使用这个批处理代码 sn-p 将 IEnumerable 分组为大小为 x 的批次时,我也遇到了这个错误:stackoverflow.com/a/44505349/1040437 我的老板在 Resharper 中看到了警告并翻转了出来。但据我所知,这是完全安全的代码。