C#6看到了null conditional
运算符的引入,并且将它与事件触发相结合的特定语法(Invoke()
被专门引入以允许null条件用于事件):
SomeEvent?.Invoke(...);
在我看来,将null条件应用于添加和删除事件委托也是有用的:
SomeProperty?.SomeEvent += SomeDelegate;
这不起作用,因为如果+=
评估为SomeProperty?.SomeEvent
,null
运算符会抛出空引用异常。
与使用Invoke()
的方式类似,我们可以写:
SomeProperty?.SomeEvent.Add(SomeDelegate);
我简单地想知道这是否有效,因为+=
和-=
运算符只是为事件隐式或显式定义的Add
和Remove
方法的简写,但当然没有(我不认为你可以直接致电Add()
或Remove()
)。
我的问题是:
if (SomeProperty != null) { }
)。在打字/混淆方面可能会有相同的节省,这似乎首先激发了无效条件:
Some?.Chain?.Of?.Properties?.SomeEvent += SomeDelegate;
修改
我想到尝试(有点笨拙):
SomeProperty?.SomeEvent ?? new EventHandler((o, e) => { }) += ...
期望new EventHandler
将被快速删除或甚至完全优化,因为没有保留对它的引用,但编译器抱怨"事件SomeEvent
只能出现在+ =或 - ="的左侧。也许还有:我不希望我的代码看起来像这样!