已释放闭包的访问 - 将方法标记为安全

15
这篇文章讲述的是ReSharper的警告“访问已释放的闭包”,通常在一个稍后被释放的对象被用在lambda表达式中时出现。更多详情请见C#中的访问已释放的闭包?
我的问题是:对于接受这种lambda表达式并立即执行它们的方法(因此您可以确保它们在该对象被释放之前始终被执行):
是否有一种方法可以将它们标记为安全,以使使用该方法的任何代码不再产生这些警告?
例如:
using (var myObject = new MyDisposableObject())
{
    DoThisTwice(() => myObject.DoSomething());
}

...

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

DoThisTwice接受一个委托(或Lambda表达式)并同步执行它。方法返回时,Lambda将不再执行。只有在此之后,myObject才被处理,所以我们可以放心使用。我们可以在调用DoThisTwice的代码行上加上注释,但需要在所有使用该方法的类似方式的地方都这样做。相反,我想把DoThisTwice标记为安全的,这样Resharper就不会为任何调用该方法的人显示任何警告。

1个回答

25

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

您可以按照以下方式进行修复:

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

InstantHandle 属性告诉 ReSharper 该动作立即调用,不会存储在方法作用域之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接