这个ReSharper“获得处置关闭”警告有什么值得担心的吗?

时间:2014-12-01 04:56:34

标签: c# entity-framework

这与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,如下图所示。

enter image description here

我知道这是为了防止在参数超出范围后评估表达式的情况。但是,在这种情况下,表达式被分配给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,那么第二行也应该是。

enter image description here

1 个答案:

答案 0 :(得分:16)

这在ReSharper中已经存在了很长一段时间的错误,如dev board中所述。不幸的是,这是6.1以来的一个问题。

  

不幸的是,ReSharper分析不够智能,无法跟踪查询表达式是否在“using ...”块内执行。目前,它只跟踪一个表达式。

     

我们将在未来版本中提高智慧

基本上,分析引擎只能在一个表达式中匹配一个from和一个using。它不会影响代码的功能;只有警告,忽略它是完全安全的。删除.ToList()不会影响表达式树的解析。