"获得处置关闭"是什么意思?

Mik*_*sen 7 c# resharper closures

我有以下代码:

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();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

reSharper给了我警告:

获得处置关闭

在线上:

dbRecipes.ForEach(r => session.Delete(r));
Run Code Online (Sandbox Code Playgroud)

(session变量以下划线标出为罪魁祸首).

虽然这是真的,该ForEach方法采用lamba表达式,在变量周围创建一个闭包session,我没有看到在执行此代码时可能会被处理的方式.也许reSharper认为ForEach可以并行执行某种任务,或者将其保存Action<>一段时间,因此从技术上讲,它可能会在内存中仍然可以访问匿名函数时被处理掉.

我安全忽略这个警告吗?有没有办法可以重新格式化我的代码以防止出现此警告?这段代码确实存在危险吗?

我习惯于reSharper比我聪明,所以我想知道究竟发生了什么.

Mit*_*eat 11

因为session包装在using语句中,所以LINQ执行可以在枚举之前执行.

Resharper警告说这可能会导致异常,因为在dbRecipes枚举的时候,session可能已经处理掉了.

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

  • `ForEach`应该立即枚举`dbRecipes`,对吧?所以不应该推迟任何事情. (2认同)