这与this one不同,因为在这种情况下警告是有效的。在这种情况下,根据接受的答案,警告无效。当我在寻找答案时,我看到了这个问题,它没有回答这个问题。
给出以下代码:
internal List<PaletteClass> GetPaletteList( int userId )
{
using(var stashEntities = new StashEntities<StashClass>())
using(var paletteEntities = new PaletteEntities<PaletteClass>())
{
var paletteList = from palette in paletteEntities.Palettes
from stash in stashEntities.Stashes
where palette.UserId == userId && stash.StashId == palette.StashId
select palette;
return paletteList.ToList();
}
}
当StashEntities和PaletteEntities继承自DBContext时,我收到警告&#39;访问处置关闭&#39;参考stashEntities,如下图所示。
我知道这是为了防止在参数超出范围后评估表达式的情况。但是,在这种情况下,表达式被分配给usings中的列表,因此stashEntities应该在范围内。
请注意,如果我按如下方式交换表达式:
var paletteList = from stash in stashEntities.Stashes
from palette in paletteEntities.Palettes
where palette.UserId == userId && stash.StashId == palette.StashId
select palette;
return paletteList.ToList();
然后ReSharper将警告移动到paletteEntities。
问题:在这种情况下,此ReSharper警告是否需要担心,还是应该添加ReSharper注释以忽略此行?
奖励问题(如果对上一个问题的回答被忽略):如果我刚刚返回paletteList而没有调用ToList()并强制表达式被评估,该怎么办? ReSharper不担心paletteEntities(在原始示例中)这一事实使我认为有一些事情要保持在范围内,这同样适用于stashEntities并且一切都会好吗?
更新/简化
如下图所示,即使只使用了一个DBContext(stashPaletteEntities),我也会得到相同的消息,这意味着接受的答案是正确的 - 这是ReSharper中的一个错误。如果引用stashPaletteEntities的第一行是OK,那么第二行也应该是。
答案 0 :(得分:16)
这在ReSharper中已经存在了很长一段时间的错误,如dev board中所述。不幸的是,这是6.1以来的一个问题。
不幸的是,ReSharper分析不够智能,无法跟踪查询表达式是否在“using ...”块内执行。目前,它只跟踪一个表达式。
我们将在未来版本中提高智慧
基本上,分析引擎只能在一个表达式中匹配一个from
和一个using
。它不会影响代码的功能;只有警告,忽略它是完全安全的。删除.ToList()
不会影响表达式树的解析。