我有以下代码:
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] 删除。
我来说两句