Что означает «Доступ к закрытому закрытию»?
У меня есть следующий код:
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));
(Thesession
переменная подчеркивается как виновник).
Хотя это правдаForEach
метод принимает выражение лямбы, которое создает замыкание вокруг переменнойsession
Я не вижу способа, где он может быть удален при выполнении этого кода. Возможно, ReSharper думаетForEach
может выполнить какое-то задание параллельно или сохранитьAction<>
позднее, таким образом, технически он может быть удален, пока анонимная функция все еще доступна в памяти.
Могу ли я проигнорировать это предупреждение? Есть ли способ, которым я могу переформатировать свой код, чтобы предотвратить появление этого предупреждения? Действительно ли опасность представляет этот код?
Я привык повторять, что умнее меня, поэтому я хотел бы точно понять, что происходит.