【发布时间】:2015-09-23 08:03:32
【问题描述】:
C# 6.0 添加了这个新的?. 运算符,现在允许像这样调用事件:
someEvent?.Invoke(sender, args);
现在,根据我的阅读,这个运算符保证 someEvent 被评估一次。 使用这种调用而不是经典模式是否正确:
var copy = someEvent
if(copy != null)
copy(sender, args)
我知道certain scenarios 上面版本的模式需要额外的锁,但让我们假设最简单的情况。
【问题讨论】:
-
是的。 Jon Skeet 有一篇关于这样做的博客文章。
-
其实是一组操作符:
?.,?[。 -
@Paulo Morgado,我确实在问题中更正了它,但是我在 Linqpad5 语法树视图中发现,它是单个
?被解析为运算符令牌,以下[0]被解析为SingleMemberAccessExpression, or some other expression in case of.`访问。 -
@GrzegorzSławecki 所有这些都形成了
ConditionalAccessExpression,对吧? IT 可能更像是一场哲学讨论,但这就是该语言的文档(而不是编译器)所说的。 -
@Paulo Morgado,我同意这只是一个哲学讨论,文档中确实如此。我只是想知道为什么。我的推理是,如果
?[是一个运算符,那么我们如何调用对应的]。