“获得被处置的封闭物”是什么意思?

迈克·克里斯滕森

我有以下代码:

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方法的确采用了lamba表达式,该表达式围绕变量创建了一个闭包session,但我看不到在执行此代码时可能会丢弃它的方式。也许reSharper认为ForEach可以并行执行某种任务,或者将其保存Action<>一段时间,因此从技术上讲,可以在内存中仍可以访问匿名函数的情况下将其处置。

我可以安全地忽略此警告吗?有没有一种方法可以重新格式化我的代码,以防止出现此警告?此代码确实存在危险吗?

我曾经习惯于比我更聪明,所以我想确切地了解正在发生的事情。

米奇小麦

因为session被包装在using语句中,所以可以将LINQ执行推迟到枚举为止。

Resharper警告说,这可能会导致异常,因为在dbRecipes枚举时间之前,这些session可能已被处置。

老实说:我不确定上面的代码是否会以警告的方式失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章