加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:53:39 所属栏目:百科 来源:网络整理
导读:这是关于ReSharper的警告“访问被安排的关闭”,通常在lambda中使用稍后安置的对象时出现. Access to disposed closure in C#?更详细地讨论了这一点. 我的问题是:对于采用这样的lamdbas并立即执行它们的方法(所以你可以确定它们总是在所有对象被处理之前被执
这是关于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该操作是立即调用的,不会超出方法的范围.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读