2015-11-12 2 views
1

Это пример кода для объявления массива UnityAction.
И назначьте каждый метод для элементов.Назначение имени метода UnityAction (Delegate)

public class Car { 
    int _wheels; 
    public Car(int wheels){_wheels = wheels;} 
    public void Go(){ 
     Debug.Log ("GO:"+_wheels); 
    } 
} 

public class UnityEventTest : MonoBehaviour { 
    void Start() 
    { 
     UnityAction []action = new UnityAction[2]; 

     //case #1 
     action[0] = new UnityAction(FuncA); 
     //case #2 
     action[1] = FuncB; 

     action[0].Invoke(); 
     action[1].Invoke(); 

     //---------------------------------- 
     Car aCar = new Car(1); 
     Car bCar = new Car(2); 

     Car []carList = new Car[2]; 
     carList[0] = aCar; 
     carList[1] = bCar; 

     carList[0].Go(); 
     carList[1].Go(); 
    } 
    void FuncA(){Debug.Log ("A");} 
    void FuncB(){Debug.Log ("B");} 
} 

Оба Case # 1 и Case # 2 работы скважины.

Выход:

A 
B 
GO:1 
GO:2 

Но я не понимаю, почему дело № 2 работы?
В каждом элементе массива не может быть экземпляра UnityAction.
Код просто назначает метод класса. И, насколько я знаю C# делегат (как UnityAction) является ссылочными типами данных.

Поэтому я думаю, что случай # 2 должен внести некоторую ошибку или не может быть назначен.

В отличие от нижнего регистра, я думаю, что имя метода не является экземпляром.

+0

где - единство? –

+0

UnityEngine.Events.UnityAction –

+0

Что вы подразумеваете под «В каждом элементе массива не может быть экземпляра UnityAction.»? Что должно вызывать ошибку с нулевым указателем? –

ответ

1

Хорошо, первое, что замечает, что UnityAction() является делегатом пустоты. Если вы посмотрите декларацию вы можете подтвердить, что:

//From Assembly sourcecode: 
namespace UnityEngine.Events 
{ 
    public delegate void UnityAction(); 
} 

Так что в случае # 1 вы создаете недействительным делегата от FuncA, поскольку FuncA возвращает недействительным нет никаких проблем делать это (вы можете попытаться изменить void FuncA к int FuncA и посмотрим, что произойдет :))!

Теперь в случае №2 вы напрямую назначаете FuncB (что является методом) UnityAction (делегат) без использования какого-либо явного или неявного литья!

Как это работает? Ну, ответ, кажется, что называется delegate-method-group-conversion что:

»... упрощает синтаксис, используемый для назначения метода делегата Метод группа преобразование позволяет присвоить имя методы. для делегата , без использования нового или явно вызывающего конструктора делегата . "

Таким образом, без специального синтаксиса вы можете назначить метод делегату, в данном конкретном случае, UnityAction.

+0

полностью понимает. Благодарю. –

Смежные вопросы