我总是这样调用事件
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)
关于后一种方法的一些问题,我以前没见过:
?在事件名称之后检查处理程序是否为空?.Invoke()看起来很简单?.Invoke()第二个例子也是如此?想必是?在事件名称检查处理程序是否为空之后?
是.它是C#6中引入的null条件运算符.它在各种方面都很有用.
我已经使用了第一个例子多年,并意识到它可以防止竞争条件......大概
?.Invoke()第二个例子也是如此?(见问题#1)
是.基本上,它们是等价的.特别是,它并没有评估MyEvent两次表达.它计算一次,然后如果结果为非null,则调用Invoke它.