我将通过以下代码:
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
在这里有什么意义吗?我删除了这一行并运行程序,一切都像以前一样。
感谢。
答案 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 answer,this blog post from Eric Lippert和this SO answer。
void SomeEventInvoke(object sender, EventArgs args) {
EventHandler ev = SomeEvent;
if (ev != null) ev(sender, args);
}