【问题标题】:Is this ReSharper "Access to disposed closure" warning something to worry about?这个 ReSharper“访问已处置的闭包”警告是否值得担心?
【发布时间】: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


    【解决方案1】:

    正如他们的dev board 中所述,这是 ReSharper 中的一个错误已经有一段时间了。不幸的是,自 6.1 以来,这一直是个问题。

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

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

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

    【讨论】:

    • Resharper 2017.3.5 中仍未修复。
    • Resharper 2018.3.4 仍然存在问题
    • Reshaper 2019.2 仍然存在问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多