为什么在调用之前检查事件是否为null的附加if语句?

时间:2014-02-06 10:47:41

标签: c# .net events visual-studio-2012 delegates

我将通过以下代码:

public delegate void PersonArrivedEventHandler(string personName, byte[] personId);

    public class SCLib
    {
        public event personArrivedEventHandler personrrived;

        public SCLib()
        {
            // Simulate that the person arrived after 2000 milli-seconds.
            Task.Run(() =>
            {
                System.Threading.Thread.Sleep(2000);
                OnPersonArrived("personName", new byte[] { 0x20, 0x21, 0x22 });
            });
        }

        protected virtual void OnPersonArrived(string smartCardReaderName, byte[] smartCardId)
        {
            if (this.personArrived != null)
            {
                PersonArrived(personName, personId);
            }
        }
    }

但是,我不知道这条线的意义是什么, if (this.personArrived != null)

为什么要在这里完成检查? if statement在这里有什么意义吗?我删除了这一行并运行程序,一切都像以前一样。

感谢。

5 个答案:

答案 0 :(得分:1)

如果class的使用者没有订阅该事件,那么调用event将引发异常,因为PersonArrived如果没有订阅则为null。

答案 1 :(得分:1)

如果您使用未分配处理程序的事件,则会生成异常,因为它为null,因此您需要在启动事件之前对其进行检查。

答案 2 :(得分:1)

因为如果没有代表附加到事件,它将为null。如果您尝试调用此类null事件,您将获得标准NullReferenceException

答案 3 :(得分:1)

'Events'是使用add handler在类对象中订阅的。

SCLibObject.personrrived += new personArrivedEventHandler(somemethod)

如果类对象未订阅该事件,那么您将获得NullReferenceException。因此,在调用事件之前,请检查它是否为空。

答案 4 :(得分:1)

在多线程应用程序中,您应该在调用之前将事件处理程序存储在局部变量中。有关详细信息,请参阅this SO answerthis blog post from Eric Lippertthis SO answer

void SomeEventInvoke(object sender, EventArgs args) {
    EventHandler ev = SomeEvent;
    if (ev != null) ev(sender, args);
}