2017-06-21 119 views
1

例如,DelegateHandler是我发送的事件Unity3D C#检查,如果事件是空

public class DelegateHandler : MonoBehaviour 
{ 

    public delegate void OnButtonClickDelegate(); 
    public static OnButtonClickDelegate buttonClickDelegate; 

    public void OnButtonClick() 
    { 
    if(buttonClickDelegate!=null) 
     buttonClickDelegate(); 
    } 

} 

有些线程提到我需要检查之前分配给事件一个变量,如果它为null,如:

OnButtonClickDelegate tempEvent = buttonClickDelegate; 
    if(tempEvent!=null) 
     tempEvent(); 

这是因为,在多线程程序中,我们需要检查是否有一些事件在检查它为空和调用事件之间取消订阅。 但Unity3D是单线程的,我们是否也需要这样做?我可以只写为

 if(buttonClickDelegate!=null) 
     buttonClickDelegate(); 

回答

5

有些线程提到我需要 之前分配给事件一个变量检查​​,如果它是空喜欢... 但Unity3D是单线程的,难道我们还需要做这个?

你并不需要做的是在一个正常的统一应用。

现在,如果您启动另一个Thread,并且您想从该Thread调用该事件,那么是的,您必须这样做。如果你是而不是创建另一个线程,你不需要这样做。


需要注意的是统一的回调函数,如OnAudioFilterRead被称为在另一个线程。如果你正在使用这个函数,并且你想从那里调用你的事件,那么你必须在检查它是否为null之前给事件分配一个变量。

但我仍然需要检查空,对吧?

是的,在致电活动之前,您应该始终检查null

在新C#6你能做到这一点

buttonClickDelegate?.Invoke(); 

其去除null检查,但你不能这样做,但在团结,因为团结不支持C#6

+0

但我仍然需要检查null,对吧? – ywj7931

+0

我的第一个问题是回复*“某些线程提到我需要在检查它是否为空之前为事件分配一个变量”*。我的第二个是,如果你必须检查“null”是“是”,则回复。 – Programmer

+1

只是为了阐明本答案中已经提到的内容,可以在Unity中执行通常的C#线程,并且如果使用多线程方式,那么您还需要检查null。 – BrokenBacon