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

9
例如,实现 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. 将事件复制到本地变量中以防止多线程出现错误(这里有一些示例)。如果不将其复制到本地变量,则Resharper会给出通知:

Possible NullReferenceException

  1. 将其检查为空,以避免NullReferenceException

但是现在,我们可以使用?.运算符进行空值检查。如果我使用它,Resharper就会处于闲置状态: No errors

所以问题是: 如果我使用空值条件运算符,是否应该将事件ProperyChanged复制到本地变量中?

2个回答

11
如果我使用空值条件运算符,那么我是否应该复制事件PropertyChanged到本地变量中?
不需要。事实上,引入空值条件运算符的主要原因之一是简化使用此模式的代码。它具有与将源值复制到本地变量相同的效果,并固有地避免了“检查和使用”并发陷阱,这是“复制到本地变量”的技术旨在解决的问题。
参见相关帖子:
调用事件,h(args) vs EventName?.Invoke()(几乎是精确的重复...虽然它从稍微不同的角度探讨了问题)
为什么我应该在调用自定义事件之前检查 null?
使用扩展方法触发C#事件-这样做好吗?
在引发事件之前分配事件给本地变量是否有任何理由?

1

有另一种方式进行空值检查 - 将delegate{}简单赋值给您的事件,这样它就永远不会为空

public event PropertyChangedEventHandler PropertyChanged = delegate{};

3
是的,我知道这个解决方案,但当不必要时,我不想创建新的对象。 - Backs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接