事件处理程序和空条件运算符
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));
}
两件事:
- 将事件复制到局部变量以防止多线程错误(here 是一些示例)。如果您不复制到局部变量,Resharper 会发出通知:
- 检查它是否为空,以防止
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{};
例如实现INotifyPropertyChanged
接口:
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
两件事:
- 将事件复制到局部变量以防止多线程错误(here 是一些示例)。如果您不复制到局部变量,Resharper 会发出通知:
- 检查它是否为空,以防止
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{};