C#事件,那个null的东西是什么?

Rob*_*Rob 4 c# events

在提出事件时,我无法真正理解这个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.我应该怎样或者用什么"填充"它才能起作用?

谢谢!

Øyv*_*hen 9

这里的事情是,如果注册零侦听器来监听此事件被引发,则事件为空.如果一个或多个听众被注册,它将具有一个值.

这意味着如果注册了零侦听器,并且您尝试在不执行空检查的情况下引发事件,则程序将引发异常.

  • @pst:确实如此。我刚刚检查过。 (2认同)

Jon*_*eet 7

您需要使用处理程序订阅该事件.例如:

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)

有关更多信息,您可能需要阅读我关于事件和代理的文章.

请注意,我已修复了上面BallClassOnHit上面的大小 - 最好使用标准的.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.

  • @Rob:我认为阅读文章让你的想法变得清晰,而不仅仅是使用粘贴的代码并让你当前的程序正常工作,这一点更为重要. (4认同)