这个ReSharper的“Access to disposed closure”警告是否值得担忧?

14

这与这个不同,因为那种情况下警告是有效的。而在这种情况下,根据被接受的答案,警告是无效的。我在寻找答案时看到了那个问题,但它并没有回答这个问题。

给定以下代码:

    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。

enter image description here

我知道这是为了防止在参数超出作用域后表达式被评估的情况。但是,在这种情况下,表达式被分配给了使用中的列表,因此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中的一个bug。如果引用stashPaletteEntities的第一行是OK的,那么第二行也应该是OK的。

enter image description here

1个回答

21

这是ReSharper存在已久的一个问题,正如他们在开发版中所述。很遗憾,这个问题从版本6.1就一直存在。

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

我们将在未来的版本中增加智能性。

实际上,分析引擎只能将一个from与单个表达式中的一个using匹配。这不会影响代码的功能;只是一个警告,可以安全地忽略。删除.ToList()不会影响表达树的解析。


2
仍未在Resharper 2017.3.5中修复。 - dcp
1
仍然存在Resharper 2018.3.4的问题。 - Simon Goodman
2
仍存在Resharper 2019.2的问题。 - GunWanderer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接