事件处理程序和空条件运算符

Event handler and null-conditional operator

例如实现INotifyPropertyChanged接口:

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null)
        handler.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

两件事:

  1. 将事件复制到局部变量以防止多线程错误(here 是一些示例)。如果您不复制到局部变量,Resharper 会发出通知:

  1. 检查它是否为空,以防止NullReferenceException

但是现在,我们可以使用 ?. 运算符进行空值检查。如果我使用它,Resharper 是空闲的:

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

should I copy event ProperyChanged to local variable, if I use null-conditional operator?

不,没有必要。事实上,引入 null 条件运算符的主要原因之一是使用此模式简化代码。它与将源值复制到局部变量具有相同的效果,并且本质上避免了 "copy to local variable" 技术旨在解决的 "check and use" 并发陷阱。

查看相关帖子:
(几乎完全相同……虽然它确实从略微不同的角度处理问题)

Raising C# events with an extension method - is it bad?

还有其他方法进行空值检查 - 简单地将委托{}分配给您的事件,因此它永远不会为空值

public event PropertyChangedEventHandler PropertyChanged = delegate{};