【问题标题】:Access to disposed closure - mark methods as safe访问已处置的闭包 - 将方法标记为安全
【发布时间】:2014-02-05 05:47:45
【问题描述】:

这是关于 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 就不会为该方法的任何调用者显示任何警告。

【问题讨论】:

    标签: c# lambda closures resharper idisposable


    【解决方案1】:

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

    你可以这样修复它:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 2017-01-26
      • 1970-01-01
      • 2013-10-15
      • 2012-05-16
      相关资源
      最近更新 更多