【问题标题】:Can I use null conditional operator instead of classic event raising pattern? [duplicate]我可以使用空条件运算符而不是经典的事件引发模式吗? [复制]
【发布时间】: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,我同意这只是一个哲学讨论,文档中确实如此。我只是想知道为什么。我的推理是,如果?[是一个运算符,那么我们如何调用对应的]

标签: c# .net events c#-6.0


【解决方案1】:

是的

Null-conditional Operators on MSDN

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

没有空条件运算符

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

使用空条件运算符

PropertyChanged?.Invoke(e)

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

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多