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

时间:2014-01-16 10:55:53

标签: c# lambda closures resharper idisposable

这是关于ReSharper的警告“获得处置关闭”,这通常在稍后处置的物体用于lambda时出现。 Access to disposed closure in C#?更详细地讨论了这一点。

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

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

示例:

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

...

void DoThisTwice(Action do)
{
    do();
    do();
}

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

1 个答案:

答案 0 :(得分:22)

您可以使用ReSharper的注释来解决此问题。 ReSharper无法知道封闭持续多长时间,例如它可能被分配给一个字段,因此它警告你,你可能正在使用一些将在lambda被调用时被处置的东西。

你可以这样解决:

void DoThisTwice([InstantHandle] Action action)
{
    action();
    action();
}

InstantHandle属性告诉ReSharper,该操作立即被调用,而不是存储在方法范围之外。