这是关于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不会为该方法的任何调用者显示任何警告.
这与此不同,因为在这种情况下警告是有效的.在这种情况下,根据接受的答案,警告无效.当我在寻找答案时,我看到了这个问题,它没有回答这个问题.
给出以下代码:
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),我也会得到相同的消息,这意味着接受的答案是正确的 …