【问题标题】:Event handler and null-conditional operator [duplicate]事件处理程序和空条件运算符
【发布时间】:2016-05-20 04:44:25
【问题描述】:

例如实现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. 将事件复制到局部变量以防止多线程错误(here 是一些示例)。如果您不复制到局部变量,Resharper 会发出通知:

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

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

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

【问题讨论】:

    标签: c# .net event-handling resharper


    【解决方案1】:

    如果我使用空条件运算符,我应该将事件 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?

    【讨论】:

      【解决方案2】:

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

      public event PropertyChangedEventHandler PropertyChanged = delegate{};
      

      【讨论】:

      • 是的,我知道这个解决方案,但我不想在没有必要的时候创建新对象
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2016-04-10
      • 2010-11-27
      • 2017-08-25
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多