【问题标题】:how to make sure there is exactly one event handler in C# [duplicate]如何确保 C# 中只有一个事件处理程序 [重复]
【发布时间】:2010-11-08 13:37:13
【问题描述】:

可能重复:
How to ensure an event is only subscribed to once

有时我想附加一个事件处理程序,但我不确定我是否已经为该对象完成了它。我的解决方法是使用 -= 删除它,然后使用 += 添加它。有没有更好的办法?

编辑:我想确保不做两次(或更多)的原因是,如果我这样做,它将被解雇两次(或更多)

【问题讨论】:

  • 我的建议:确定。为什么会出现不知道自己程序状态的情况?
  • 不要误会我的意思,但您手头的问题比确保只有一个事件处理程序更大。我的意思是,如果是你自己的代码,你怎么会不知道你已经添加了一个事件处理程序?

标签: c# refactoring event-handling


【解决方案1】:

删除事件然后添加它的解决方案可能会在多线程场景中崩溃,您可以有效地最终添加重复或异常。

您可以在您的活动中实施add and remove,但这有其自身的警告。

如果你真的只需要一个单一的演员类型动作,你可以考虑只传递一个动作并在需要时调用它,这样可以节省你遇到的一些困难的边缘情况。

【讨论】:

    【解决方案2】:

    所以,我假设您无法控制引发事件的类,并且您无法在那里检查它。如果您需要运行时检查您是否仅在接收端注册了一个事件,您可以将您的注册集中在一个检查您是否已经注册的方法中,例如...

    private void RegisterForEvent()
    {
      lock( _registerLock )
      {
        if( !_iveDoneThisAlready )
        {
          _iveDoneThisAlready = true;
          // register for Event here
        }
      }
    }
    

    但是,您的代码必须同意该约定。没有强制注册者调用此方法而不是 +=。

    【讨论】:

      【解决方案3】:

      你试过了吗:

      public event MyClickHandler Click = delegate {}; // add empty delegate!
      

      更多详情结帐:Hidden Features of C#?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-05
        • 2011-11-12
        • 2011-03-18
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        相关资源
        最近更新 更多