调用事件,h(args)vs EventName?.Invoke()

jle*_*ach 7 c# events

我总是这样调用事件

void onSomeEvent(string someArg) {
    var h = this.EventName;
    if (h != null) {
        h(this, new MyEventArgs(someArg));
    }
}
Run Code Online (Sandbox Code Playgroud)

今天VS 2015告诉我这可以简化:

MyEvent?.Invoke(this, new MyEventArgs(someArg));
Run Code Online (Sandbox Code Playgroud)

关于后一种方法的一些问题,我以前没见过:

  1. 大概是?在事件名称之后检查处理程序是否为空?
  2. 假设处理程序不为null,.Invoke()看起来很简单
  3. 我已经使用了第一个例子多年,并意识到它可以防止竞争条件......大概?.Invoke()第二个例子也是如此?

Jon*_*eet 6

想必是?在事件名称检查处理程序是否为空之后?

是.它是C#6中引入的null条件运算符.它在各种方面都很有用.

我已经使用了第一个例子多年,并意识到它可以防止竞争条件......大概?.Invoke()第二个例子也是如此?(见问题#1)

是.基本上,它们是等价的.特别是,它并没有评估MyEvent两次表达.它计算一次,然后如果结果为非null,则调用Invoke它.

  • @ jdl134679:是的,`if(MyEvent!= null){MyEvent.Invoke(...); 确实是因为它读两次而引起的 - 因为它第一次可能是非空的,第二次是null.所以你只需要阅读一次.您可以将值存储在局部变量中,或使用空条件运算符. (3认同)