我可以使用null条件运算符而不是经典事件提升模式吗?

C#6.0添加了这个新的?. 现在允许调用这样的事件的运算符:

 someEvent?.Invoke(sender, args); 

现在,根据我的阅读,这个运算符保证someEvent被评估一次。 使用这种调用而不是经典模式是否正确:

 var copy = someEvent if(copy != null) copy(sender, args) 

我知道某些情况下上面版本的模式需要额外的锁,但让我们假设最简单的情况。

请参阅MSDN上的Null条件运算符

有一个例子涵盖了你的要求

没有null条件运算符

 var handler = this.PropertyChanged; if (handler != null) handler(…) 

使用null条件运算符

 PropertyChanged?.Invoke(e) 

新方法是线程安全的,因为编译器只生成一次评估PropertyChanged的代码,将结果保存在临时变量中。