自测代理:避免在调用之前检查null?

Meh*_*ANI 8 .net c#

有没有什么聪明的方法可以避免在以一般方式调用事件之前测试事件的无效性?很明显,如果我调用一个委托,我希望它被分配.
(如果我真的想要/需要测试它的无效性,我最终可以明确地做到这一点,但系统地进行这种测试有点单调乏味.)

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在这里写了一篇关于这个主题的非常全面的文章.上面的技术仍然受到第二种竞争条件的影响,因此事件处理程序需要在事件取消后才能被调用.

  • 我刚刚编写了一个测试程序,其中包含`public event EventHandler ValueChanged = delegate {};`订阅事件`obj.ValueChanged + = new EventHandler(obj_ValueChanged);`,更改一个值(从而触发事件处理程序),取消订阅`obj.ValueChanged - = obj_ValueChanged;`,再次更改值(不触发事件),但没有任何空引用异常.添加事件意味着将连接2个事件处理程序.删除该事件将使您返回到1(无操作委托).你是100%肯定你没有做别的事吗? (8认同)