C# · 12月 30, 2021

c# – 访问已设置的关闭 – 标记方法安全

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

解决方法 您可以使用ReSharper的注释来修复此问题. ReSharper无法知道关闭持续多长时间,例如它可能被分配到一个字段,所以它警告你,你可能正在使用的东西,将在lambda调用的时候处理.

你可以这样修复:

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

InstantHandle属性告诉ReSharper该操作是立即调用的,不会超出方法的范围.