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可能已经处理掉了.
老实说:我不确定上面的代码是否会以警告的方式失败.
| 归档时间: |
|
| 查看次数: |
8062 次 |
| 最近记录: |