在提出事件时,我无法真正理解这个null测试的东西是什么.
说我有这个代码.
class ballClass
{
public event EventHandler BallInPlay;
public void onHit()
{
if (BallInPlay != null)
{
BallInPlay(this, new EventArgs());
}
else
{
MessageBox.Show("null!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
而且我想在触发onHit()方法时引发BallInPlay.
现在它告诉我BallInPlay是null.我应该怎样或者用什么"填充"它才能起作用?
谢谢!
这里的事情是,如果注册零侦听器来监听此事件被引发,则事件为空.如果一个或多个听众被注册,它将具有一个值.
这意味着如果注册了零侦听器,并且您尝试在不执行空检查的情况下引发事件,则程序将引发异常.
您需要使用处理程序订阅该事件.例如:
BallClass ball = new BallClass();
ball.BallInPlay += BallInPlayHandler;
// Now when ball.OnHit is called for whatever reason, BallInPlayHandler
// will get called
...
private void BallInPlayHandler(Object sender, EventArgs e)
{
// React to the event here
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,您可能需要阅读我关于事件和代理的文章.
请注意,我已修复了上面BallClass
和OnHit
上面的大小 - 最好使用标准的.NET命名约定来使代码更好地适应它周围的代码,并使其对其他代码更具可读性.
有一点需要注意:您目前所获得的无效检查不是线程安全的.最后用户可以退订后的if
,但调用之前.线程安全的版本是:
public void OnHit()
{
EventHandler handler = BallInPlay;
if (handler != null)
{
handler(this, new EventArgs());
}
else
{
MessageBox.Show("null!");
}
}
Run Code Online (Sandbox Code Playgroud)
这将无法保证使用最新的用户(如还有不涉及记忆障碍),但它是保证不会抛出由于竞争条件一个NullReferenceException.
归档时间: |
|
查看次数: |
3873 次 |
最近记录: |