C#中的内联功能块

时间:2014-11-25 09:18:59

标签: c# unity3d objective-c-blocks dotween

使用Unity的dotween库:http://dotween.demigiant.com/documentation.php

在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
    });
}

4 个答案:

答案 0 :(得分:6)

C#的做法是使用lambdas:

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));

答案 1 :(得分:5)

您正在寻找C#statement lambdas

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

答案 2 :(得分:4)

使用匿名lambda函数:

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

答案 3 :(得分:3)

更一般地说,除了已经给出的答案之外,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);

由于以这种方式声明委托可能非常耗时并且使代码更加混乱,因此他们提出了通用委托类型:Action<...>(对于void方法)和Func<...>(对于具有返回类型的方法) )。现在你可以简单地说:

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

无需显式定义自定义MethodPointer-delegate。

Lambda表达式,如其他帖子中所述,通过让您定义类似内联的函数,使得更容易实例化委托,以便您可以直接在OnComplete()调用中定义SomeMethod()的实现,例如:

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

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

使用lambda的另一个好处是实现可以访问本地变量。