有没有/应该有一种订阅/取消订阅C#6的无条件事件的方法?

时间:2016-03-15 14:03:22

标签: c# events

C#6看到了null conditional运算符的引入,并且将它与事件触发相结合的特定语法(Invoke()被专门引入以允许null条件用于事件):

SomeEvent?.Invoke(...);

在我看来,将null条件应用于添加和删除事件委托也是有用的:

SomeProperty?.SomeEvent += SomeDelegate;

这不起作用,因为如果+=评估为SomeProperty?.SomeEventnull运算符会抛出空引用异常。

与使用Invoke()的方式类似,我们可以写:

SomeProperty?.SomeEvent.Add(SomeDelegate);

我简单地想知道这是否有效,因为+=-=运算符只是为事件隐式或显式定义的AddRemove方法的简写,但当然没有(我不认为你可以直接致电Add()Remove())。

我的问题是:

  1. 我错过了一些意味着我已经可以做一些与此相当的事情(即不使用if (SomeProperty != null) { })。
  2. 是否可以将此语法或类似语法安全地添加到语言中?
  3. 在打字/混淆方面可能会有相同的节省,这似乎首先激发了无效条件:

    Some?.Chain?.Of?.Properties?.SomeEvent += SomeDelegate;
    

    修改

    我想到尝试(有点笨拙):

    SomeProperty?.SomeEvent ?? new EventHandler((o, e) => { }) += ...
    

    期望new EventHandler将被快速删除或甚至完全优化,因为没有保留对它的引用,但编译器抱怨"事件SomeEvent只能出现在+ =或 - ="的左侧。也许还有:我不希望我的代码看起来像这样!

0 个答案:

没有答案