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

标签 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 会发出通知:

Possible NullReferenceException

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

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

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

最佳答案

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

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

查看相关帖子:
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?

关于c# - 事件处理程序和空条件运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37338095/

相关文章:

c# - 模态对话框

.net - 在 .NET 项目中引用程序集。奇怪的行为

c# - 如何在 C# 中记录输入 (keyListener)

c# - 检查 HttpStatusCode 是否表示成功或失败

javascript - 修复 Chrome 的选项元素 onclick 事件

c# - WinForms 文本框中的换行符

c# - 转换 XML 时路径异常中的非法字符

c# - 仅在找到/存在实例时才使用 Redis 进行缓存?

ios - 自定义 UISlider 以处理从外部开始的触摸

c# - 如何在两种不同形式(同一程序)之间引发事件