空条件运算符为事件抛出空引用
Null Conditional Operator throws a Null Reference for Event
据我所知,空条件运算符 (?.) 在 运行 下一段代码之前检查空值,但在这段代码中:
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();
感谢您的快速回复
也许不是你想的那样?
?.
检查 this
是否为空 *)。实际上,this
很难为空。
public event EventArgs PageChanged;
是一个 事件 。当没有附加处理程序时,事件的 "value" 为空。此时,调用 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);
}
您需要检查 PageChanged
是否为空。然后你可以在上面调用 Invoke
来引发事件。
PageChanged?.Invoke(this,value);
旁注:这正是 Resharper 为 C# 6 推荐的内容
据我所知,空条件运算符 (?.) 在 运行 下一段代码之前检查空值,但在这段代码中:
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(); 感谢您的快速回复
也许不是你想的那样?
?.
检查 this
是否为空 *)。实际上,this
很难为空。
public event EventArgs PageChanged;
是一个 事件 。当没有附加处理程序时,事件的 "value" 为空。此时,调用 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);
}
您需要检查 PageChanged
是否为空。然后你可以在上面调用 Invoke
来引发事件。
PageChanged?.Invoke(this,value);
旁注:这正是 Resharper 为 C# 6 推荐的内容