2017-06-21 124 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