我有以下代码:
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));
(The session
变量被下划线标为罪魁祸首)。
虽然这是真的ForEach
方法采用 lambda 表达式,该表达式在变量周围创建一个闭包session
,我看不到执行此代码时可能会处理它的方法。也许 reSharper 认为ForEach
可能会并行执行某种任务,或者保存该任务Action<>
稍后,因此从技术上讲,当匿名函数在内存中仍然可访问时,它可能会被处理。
忽略这个警告我安全吗?有没有办法重新格式化我的代码以防止出现此警告?这段代码确实存在危险吗?
我已经习惯了 reSharper 比我聪明,所以我想确切地了解到底发生了什么。
Because session
包含在 using 语句中,并且 LINQ 执行可以推迟到枚举它为止。
Resharper 警告这可能会导致异常,因为到时候dbRecipes
被枚举,则session
本来可以被处置的。
老实说:我不确定上面的代码是否会以警告的方式失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)