Unity3D c#检查事件是否为空

时间:2017-06-21 00:26:40

标签: c# unity3d

例如,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 ();

1 个答案:

答案 0 :(得分:6)

  

有些线程提到我之前需要为事件分配一个变量   检查它是否为空...   但Unity3D是单线程的,我们还需要这样做吗?

您不需要在普通的Unity应用中执行此操作。

现在,如果你开始另一个Thread而你想从那个Thread调用那个事件,那么你必须这样做。如果您创建另一个线程,则无需执行此操作。

请注意,Unity的回调函数(如OnAudioFilterRead)在另一个Thread中调用。如果您正在使用此功能并且想要从那里调用您的事件,那么您必须在检查事件是否为null之前为该事件分配一个变量。

  

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

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

在新的 C#6 中你可以这样做

buttonClickDelegate?.Invoke();

删除了null支票,但由于Unity不支持 C#6 ,因此您无法在Unity中执行此操作。