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

在C#中实现RAII

发布时间:2020-12-15 04:12:28 所属栏目:百科 来源:网络整理
导读:我有一个InfoPath表单,我需要有条件地禁用它的OnChange事件.由于在表单加载后无法绑定事件处理程序,因此我不得不依赖一个全局计数器来指示是否应该执行OnChange事件. 在每个OnChange事件中,我在执行任何操作之前检查SuppressEventsCount == 0. 为了在执行某
我有一个InfoPath表单,我需要有条件地禁用它的OnChange事件.由于在表单加载后无法绑定事件处理程序,因此我不得不依赖一个全局计数器来指示是否应该执行OnChange事件.
在每个OnChange事件中,我在执行任何操作之前检查SuppressEventsCount == 0.
为了在执行某个函数或其他函数期间抑制事件,我只需设置SuppressEventsCount,并且 – 当函数退出时再次.这样做的最大问题是它不是例外.所以我有一个好主意将SuppressEvents计数器包装在一个实现iDisposable的类中
using(SuppressEvents s = new SuppressEvents()){
   // OnChange events fired here are ignored
} // OnChange events enabled again

这是有效的,但它仍然不像c解决方案那样理想,它根本不需要使用“using”指令.

有没有办法:

>当对象超出范围时触发析构函数或某些函数,或者
>防止SuppressEvents对象完全在“using”指令之外进行初始化

解决方法

关于问题2,可以通过为代码的消费者提供不同的接口来绕过它.您可以提供一个静态方法,该函数在“被抑制”的上下文中执行,而不是提供实现IDisposable的公共类,并希望它们将它包装在一个使用中.
public static class EventSuppressor {
    public void Suppress(Action action) {
        using (var s = new SuppressActions()) {
            action();
        }
    }

    private class SuppressActions : IDisposable {
        ...
    }
}

然后消费者可以使用如下:

EventSuppressor.Suppress(() => {
    // OnChange events fired here are ignored
}) // OnChange events enabled again

当然,你必须弄清楚这个设计是否合适,因为这将导致额外的函数调用,编译器生成的类和闭包等.

(编辑:李大同)

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

    推荐文章
      热点阅读