C# · 12月 22, 2021

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

C#6.0添加了这个新的?运算符现在允许调用这样的事件: someEvent?.Invoke(sender,args);

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

var copy = someEventif(copy != null) copy(sender,args)

我知道certain scenarios以上版本的模式需要额外的锁,但让我们假设最简单的情况.

解决方法 是

见Null-conditional Operators on MSDN.

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

没有null条件运算符

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

使用null条件运算符

PropertyChanged?.Invoke(e)

The new way is thread-safe because the compiler generates code to evaluate PropertyChanged one time only,keeping the result in temporary variable.