例如,DelegateHandler是我发送事件的地方
public class DelegateHandler : MonoBehaviour
{
public delegate void OnButtonClickDelegate ();
public static OnButtonClickDelegate buttonClickDelegate;
public void OnButtonClick()
{
if(buttonClickDelegate!=null)
buttonClickDelegate ();
}
}
有些线程提到我需要在检查它是否为空之前为事件分配一个变量,如:
OnButtonClickDelegate tempEvent = buttonClickDelegate;
if(tempEvent!=null)
tempEvent();
这是因为,在多线程程序中,我们需要在检查它是否为null和调用事件之间检查某些事件是否取消订阅。 但Unity3D是单线程的,我们还需要这样做吗?我可以写成
if(buttonClickDelegate!=null)
buttonClickDelegate ();
答案 0 :(得分:6)
有些线程提到我之前需要为事件分配一个变量 检查它是否为空... 但Unity3D是单线程的,我们还需要这样做吗?
否强>
您不需要在普通的Unity应用中执行此操作。
现在,如果你开始另一个Thread
而你想从那个Thread
调用那个事件,那么你必须这样做。如果您不创建另一个线程,则无需执行此操作。
请注意,Unity的回调函数(如OnAudioFilterRead
)在另一个Thread中调用。如果您正在使用此功能并且想要从那里调用您的事件,那么您必须在检查事件是否为null
之前为该事件分配一个变量。
但是我仍然需要检查null,对吧?
是的,在调用活动之前,您应该始终检查null
。
在新的 C#6 中你可以这样做
buttonClickDelegate?.Invoke();
删除了null
支票,但由于Unity不支持 C#6 ,因此您无法在Unity中执行此操作。