【问题标题】:Unity3D c# check if event is nullUnity3D c#检查事件是否为空
【发布时间】:2017-06-21 00:26:39
【问题描述】:

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

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

     if(buttonClickDelegate!=null)
       buttonClickDelegate ();

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

    没有。

    您无需在普通的 Unity 应用程序中执行此操作。

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


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

    但我还是需要检查 null 对吧?

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

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

    buttonClickDelegate?.Invoke();
    

    它删除了null 检查,但您还不能在 Unity 中执行此操作,因为 Unity 不支持 C# 6

    【讨论】:

    • 我的第一个拒绝是对的回复“有人提到我需要在检查它是否为空之前为事件分配一个变量”。如果您必须检查 null 是否为“是”,我的第二个是的回复。
    • 只是为了澄清这个答案中已经提到的内容,可以在 Unity 中执行通常的 C# 线程,如果以这种方式使用多线程,是的,您还需要检查 null。跨度>
    • 2019年还是这样吗?
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2010-11-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多