Null条件运算符为事件抛出空引用

时间:2015-09-16 21:16:15

标签: c# nullreferenceexception

据我所知,null条件运算符(?。)在运行下一段代码之前检查null,但在此代码中:

public delegate void EventArgs(object Sender, PlayerPage Page);
public event EventArgs PageChanged;
private PlayerPage _CurrentPage = PlayerPage.NoPage;
public PlayerPage CurrentPage
{
    get { return _CurrentPage; }
    set { _CurrentPage = value; PropertyChangedFire(); this?.PageChanged(this,value); }
}

但是     ?本.PageChanged(此,值); 抛出空引用异常

编辑:

哦......我多么愚蠢:) 改为PageChanged?.Invoke(); 感谢您的快速回复

2 个答案:

答案 0 :(得分:12)

您需要检查PageChanged是否为空。然后,您可以在其上调用Invoke来举起活动。

PageChanged?.Invoke(this,value);

附注:这正是Resharper为C#6推荐的内容

答案 1 :(得分:4)

也许这不是你的想法?

?.检查this是否为null *)。实际上,this很难为空。

public event EventArgs PageChanged;事件。如果没有附加处理程序,则事件的“值”为空。在这一刻,调用this?.PageChanged(this,value);会抛出。我很确定是这种情况,并且?.运算符与this无关。

*)我的意思是,您当前的代码相当于:

set
{
    _CurrentPage = value;
    PropertyChangedFire();
    if(this!=null)
        this.PageChanged(this,value);
}

在正确调用事件时,您需要:

set
{
    _CurrentPage = value;
    PropertyChangedFire();
    if(this.PageChanged!=null)
        this.PageChanged(this,value);
}

或者更确切地说,是线程安全的:

set
{
    _CurrentPage = value;
    PropertyChangedFire();
    var localref = this.PageChanged;
    if(localref!=null)
        localref(this,value);
}