为了引发事件,我们使用OnEventName方法,如下所示:
protected virtual void OnSomethingHappened(EventArgs e)
{
EventHandler handler = SomethingHappened;
if (handler != null)
{
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
但这个有什么不同?
protected virtual void OnSomethingHappened(EventArgs e)
{
if (SomethingHappened!= null)
{
SomethingHappened(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
显然第一个是线程安全的,但为什么以及如何?
没有必要开始一个新线程?
例如,实现INotifyPropertyChanged接口:
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)
两件事情:
NullReferenceException但是现在,我们可以使用?.运算符进行空值检查.如果我使用它,Resharper是空闲的:

所以,问题是:ProperyChanged如果我使用空条件运算符,我应该将事件复制到局部变量吗?