我有以下代码:
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
方法接受一个 lambda 表达式,该表达式围绕变量 session
创建了一个闭包,但我不认为在执行此代码时它会被释放。也许 reSharper 认为 ForEach
可能会并行执行某些任务,或者将那个 Action<>
保存到稍后的时间,因此在匿名函数仍然可以访问内存时可能会被释放。
我可以无视这个警告吗?有没有办法重新格式化我的代码以防止出现这个警告?这段代码确实存在危险吗?
我习惯于 reSharper 比我更聪明,所以我想确切地了解发生了什么。