为什么在 DOTween 中使用 lambda 表达式?

Why is lambda expression used in DOTween?

我在我的 Unity 项目的 C# 脚本中使用 lambda 表达式,以便在调用 DOTween 回调时调用带有参数的函数。

看起来像这样:animation.OnComplete(() => DestroyOnCompleted(children));

它工作得很好,但我很清楚为什么在这种情况下使用 lambda 表达式。我知道这与代表有关,但除此之外,我不太确定;如果我被问到,我想在考试中解释一下。

谁能赐教一下? :-)

为什么不呢? ;)

我不知道 API 太多了,但它似乎只是在期待

OnComplete(TweenCallback callback)

从你的用法来看 TweenCallback 基本上等于 c# 内置 Action delegate 并且基本上只是一个参数 less void

public delegate void TweenCallback();

所以你是否将此回调作为 lambda 传递给

animation.OnComplete(() => DestroyOnCompleted(children));

或使用delegate operator like

的匿名方法
animation.OnComplete(delegate { DestroyOnCompleted(children); });

或使用方法

animation.OnComplete(OnCompletedAnimation);
        
...

private void OnCompletedAnimation()
{
    DestroyOnCompleted(children);
}

基本等价

前两个和最后一个的主要区别是:children从何而来?

lambda 和委托方式允许您从当前作用域变量中传入 children 而无需将其存储在任何字段中!

如果您查看 DotTween 的 documentation,您会看到该行:

现在看DotTween的Source Code,可以看到TweenCallback的定义:

public delegate void TweenCallback();

所以现在的问题是,c#中的delegate void是什么?

C# 中的委托基本上是一个“代表”函数的对象。 但函数并不完全相同,它们可以在输入中有参数和 return 某些东西(或 return void)。 要了解委托代表什么样的功能,请尝试仅删除关键字 delegate.

例如没有键盘delegate的TweenCallback是:

public void TweenCaalback()

所以委托代表一个没有输入参数的void函数! (而且是 Public)。

什么意思表示一个函数?

这意味着这是有效的代码:

void DoNothing()
{

}

TweenCallback x = DoNothing;
x();

因此您可以将函数“分配”给具有相同函数签名的委托。 在这种情况下,TweenCallback 是一个委托 void(),因此您可以为其分配一个 void() 函数。

什么是 lambda?

lambda 是这种风格的表达: (string name, int age) => { return 3 };

您可以将其解读为“字符串名称和整数年龄进入 return 3”

这是描述该函数的更简洁的方式:

int AnonymousFunction (string name, int age) {}

主要区别在于 lambda 没有任何名称。如果您在输入中没有任何参数,lambda 将变成这样:

() => {return 3;}

如果您在 {} 中只有一个语句,您可以将其写得更短,如

() => 3;

最后一步

这个代码有效吗?

void DoNothing()
{

}

TweenCallback x = () => DoNothing();

是的! Tween 回调需要一个 void () 函数。

() => DoNothing(); 是一个 lambda(未命名函数),它不接受任何输入并调用其他函数。这是 () => {DoNothing();} 的较短版本,您必须将其视为 void () {DoNothing();}

所以写的时候

animation.OnComplete(() => DestroyOnCompleted(children));

您只是将 void () 函数传递给 OnComplete 方法,这是有道理的,因为 TweenCallback 是一个 void () 委托。

备注

如您所见,函数和 lambda 表达式可以隐式转换为委托。但是你必须明白它们都是不同的东西,在更高级的编码场景中,这种区别不仅仅是纯粹的理论。