有没有什么聪明的方法可以避免在以一般方式调用事件之前测试事件的无效性?很明显,如果我调用一个委托,我希望它被分配.
(如果我真的想要/需要测试它的无效性,我最终可以明确地做到这一点,但系统地进行这种测试有点单调乏味.)
public delegate void ResetTradesDelegate();
public ResetTradesDelegate ResetTradesEvents;
public void OnSessionRxAdmMessage(IVfxFixAppSession session, FixMessage msg)
{
if (ResetTradesEvent != null) //<-- Is there "any" a way not to write this test explicitly for each delegate ?
ResetTradesEvent();
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*man 14
public event EventHandler NoDataEventHandler = delegate{};
Run Code Online (Sandbox Code Playgroud)
以这种方式声明事件意味着它永远不会为空.它总是至少会连接一个no-op事件处理程序.
在你的情况下,可能
public event ResetTradesDelegate ResetTradesEvents = delegate{};
Run Code Online (Sandbox Code Playgroud)
触发事件总是会产生与之相关的竞争条件.您要么冒险尝试在null为空时调用委托,要么在事件取消挂钩后调用委托.Eric Lippert在这里写了一篇关于这个主题的非常全面的文章.上面的技术仍然受到第二种竞争条件的影响,因此事件处理程序需要在事件取消后才能被调用.