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

Bac*_*cks 7 .net c# resharper event-handling

例如,实现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)

两件事情:

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

可能的NullReferenceException

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

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

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

Pet*_*iho 9

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

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

请参阅相关帖子:
调用事件,h(args)vs EventName?.Invoke()(几乎完全重复......它确实从稍微不同的角度处理问题)
为什么我应该在调用自定义事件之前检查null?
使用扩展方法提升C#事件 - 这很糟糕吗?
是否有任何理由在提升之前将事件分配给局部变量?


归档时间:

查看次数:

1852 次

最近记录:

9 年,6 月 前