相关疑难解决方法(0)

获得处置关闭 - 标记方法是安全的

这是关于ReSharper的警告"进入处置关闭",这通常在稍后处置的物体用于lambda时出现.在C#获得处置关闭?更详细地讨论了这一点.

我的问题是:对于采用这种lamdbas并立即执行它们的方法(因此你可以确定它们总是在处理所述对象之前执行):

有没有办法将它们标记为安全,以便使用该方法的任何代码都不再产生这些警告?

例:

using (var myObject = new MyDisposableObject())
{
    DoThisTwice(() => myObject.DoSomething());
}

...

void DoThisTwice(Action do)
{
    do();
    do();
}
Run Code Online (Sandbox Code Playgroud)

DoThisTwice接受委托(或lambda)并同步执行它.到方法返回时,将不再执行lambda.只有这样myObject才会被处理掉,所以我们很高兴.我们可以DoThisTwice用注释来标记调用行,但必须以类似的方式在所有地方使用该方法完成.相反,我想标记DoThisTwice为安全,因此Resharper不会为该方法的任何调用者显示任何警告.

c# resharper lambda closures idisposable

15
推荐指数
1
解决办法
1313
查看次数

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

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

给出以下代码:

    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();
        }
    } 
Run Code Online (Sandbox Code Playgroud)

在StashEntities和PaletteEntities从DBContext继承的地方,我得到了关于stashEntities的"访问置位闭包"的警告,如下图所示.

在此输入图像描述

我知道这是为了防止在参数超出范围后评估表达式的情况.但是,在这种情况下,表达式被分配给使用中的列表,因此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();
Run Code Online (Sandbox Code Playgroud)

然后ReSharper将警告移动到paletteEntities.

问题:在这种情况下,此ReSharper警告是否需要担心,或者我是否应该添加ReSharper注释以忽略此行?

奖励问题(如果对上一个问题的回答被忽略):如果我刚刚返回paletteList而没有调用ToList()并强制表达式被评估,该怎么办?ReSharper不担心paletteEntities(在原始示例中)这一事实使我认为有一些事情要保持在范围内,这同样适用于stashEntities并且一切都会好吗?

更新/简化

如下图所示,即使只使用了一个DBContext(stashPaletteEntities),我也会得到相同的消息,这意味着接受的答案是正确的 …

c# entity-framework

13
推荐指数
1
解决办法
6828
查看次数

标签 统计

c# ×2

closures ×1

entity-framework ×1

idisposable ×1

lambda ×1

resharper ×1