【发布时间】:2014-12-01 16:28:52
【问题描述】:
这与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 继承时,我收到警告“访问已处置的闭包”,指的是 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 的第一行是可以的,那么第二行也应该是。
【问题讨论】:
标签: c# entity-framework