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

时间:2016-05-20 04:44:25

标签: c# .net event-handling resharper

例如,实现INotifyPropertyChanged interface:

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会发出通知:
  2. Possible NullReferenceException

    1. 检查为空,以防止NullReferenceException
    2. 但是现在,我们可以使用?.运算符进行空值检查。如果我使用它,Resharper是空闲的: No errors

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

2 个答案:

答案 0 :(得分:9)

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

不,没有必要。实际上,引入空条件运算符的主要原因之一是使用此模式简化代码。它与将源值复制到局部变量具有相同的效果,并且本质上避免了“复制到局部变量”技术旨在解决的“检查和使用”并发陷阱。

见相关帖子:
Invoking Events, h(args) vs EventName?.Invoke()(几乎完全重复......但它确实从一个略微不同的角度接近问题)
Why should I check for null before I invoke the custom event?
Raising C# events with an extension method - is it bad?
Is there any reason to assign an event to a local variable before raising it?

答案 1 :(得分:1)

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

public event PropertyChangedEventHandler PropertyChanged = delegate{};