2014-11-25 8 views
0

Использование библиотеки dotween для Unity: http://dotween.demigiant.com/documentation.phpфункциональные блоки Встроенные в C#

И будучи ржавый на C# ...

Есть ли способ, чтобы определить функцию инлайн в качестве параметра .OnComplete, например, так что нам не нужно прерывать последовательность действий в отдельных функциях?

Т.е. я хотел бы использовать функцию, известную как блоки в ObjC, но в C#.

многословен неинтуитивный путь:

void myCallback() { 
    // do more stuff here 
} 
void mysequence() { 
    transform.DOMoveX(4, 1).OnComplete(myCallback); 
} 

То, что я хочу сделать что легче читать и держат вещи на месте:

void mysequence() { 
    transform.DOMoveX(4, 1).OnComplete({ 
     // do more stuff here 
    }); 
} 
+0

Какие параметры выполняет «OnComplete»? Есть ли для этого документация? – DavidG

+0

Нет параметров, документация здесь: http://dotween.demigiant.com/documentation.php – Jonny

ответ

5

Путь C# не это с лямбды:

void mysequence() { 
    transform.DOMoveX(4, 1).OnComplete(() => { 
     // do more stuff here 
    }); 
} 

Из документации вы связаны с:

// Callback without parameters 
transform.DOMoveX(4, 1).OnComplete(myCallback); 
// Callback with parameters 
transform.DOMoveX(4, 1).OnComplete(()=>myCallback(someParam, someOtherParam)); 
5

Вы ищете C# statement lambdas.

void mysequence() { 
    transform.DOMoveX(4, 1).OnComplete(() => { 
     // do more stuff here 
    }); 
} 
3

Используйте функции анонимной лямбды:

void mysequence() { 
    transform.DOMoveX(4, 1).OnComplete(() => {/*code goes here*/}); 
} 

() => {}; является анонимной функцией, которая не принимать никаких аргументов и ничего не возвращает.

a => a - анонимная функция, которая принимает один параметр и возвращает его.

Анонимные функции в C# могут быть замыканиями, то есть функции могут изменять переменные, объявленные внешними по отношению к ним.

var a = 0; 

var f =() => a++; 

f(); 

f(); 

// a is now 2 
2

На более общем плане, в дополнение к ответам, которые являются уже заданный, C# /. NET содержит понятие делегатов, которые являются добрыми, как указатели функций. Вы можете определить свою собственный делегат типы пути определения сигнатуры метода следующим образом:

delegate ReturnType MethodPointer(ParamTypeA paramA, ParamTypeB paramB); 

Затем вы можете назначить методы как функции-указатели, как так:

private ReturnType SomeMethod(ParamTypeA paramA, ParamTypeB paramB) 
{ 
    ... 
} 

MethodPointer = SomeMethod; 

или передать его в качестве обратного вызова к другому функция/метод:

private void OnComplete(MethodPointer callback) 
{ 
    ... 
} 

OnComplete(SomeMethod); 

с момента объявления делегаты таким образом может быть довольно много времени и cltter кода, они пришли с общими типами делегатов: Action<...> (для VO id) и Func<...> (для метода с возвращаемым типом). Теперь вы можете просто сказать:

Func<ParamTypeA, ParamTypeB, ReturnType> func = SomeMethod; 

без необходимости явно определять пользовательский делегат MethodPointer.

Лямбда-выражения, как упоминалось в других сообщениях, упрощают создание делегатов, позволяя вам определять встроенные функции, так что вы можете определить реализацию SomeMethod() непосредственно внутри вызова OnComplete() , например:

private void OnComplete(Action<ParameterType> callback) 
{ 
} 

OnComplete(parameter => 
{ 
    // implementation goes here... 
}); 

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