首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么DOTween中使用lambda表达式?

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

Stack Overflow用户
提问于 2022-01-12 14:19:48
回答 2查看 2.4K关注 0票数 0

我在团结项目中的C#脚本中使用lambda表达式来调用DOTween回调时带有参数的函数。

它看起来很简单:animation.OnComplete(() => DestroyOnCompleted(children));

它工作得很好,但我知道为什么在本例中使用lambda表达式。我知道这与代表们有关,但除此之外,我不太确定,如果有人问我,我想向我的考试解释一下。

有人能启发我吗?:-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-12 15:06:35

如果您查看文档 of DotTween,您会看到该行:

现在看看源代码 of DotTween,您可以看到TweenCallback的定义:

代码语言:javascript
复制
public delegate void TweenCallback();

所以现在的问题是,什么是委托 in c#?

c#中的委托基本上是一个“表示”函数的对象。但是函数并不是完全相同的,它们可以在输入中包含参数并返回某些内容(或者返回空值)。要了解委托所代表的函数类型,只需删除关键字委托即可。

例如,没有键盘委托的TweenCallback是:

代码语言:javascript
复制
public void TweenCaalback()

因此,委托表示一个没有输入参数的空函数!(这是公开的)。

这意味着代表一个

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

代码语言:javascript
复制
void DoNothing()
{

}

TweenCallback x = DoNothing;
x();

因此,您可以向具有相同函数签名的委托“分配函数”。在本例中,TweenCallback是一个委托void (),因此您可以为它分配一个void ()函数。

什么是羔羊?

lambda是该样式的表达式:(string name,int age) => {返回3 };

您可以将其理解为“字符串名称和int年龄返回3”。

这是描述该功能的一种更简洁的方法:

代码语言:javascript
复制
int AnonymousFunction (string name, int age) {}

主要的区别是lambdas没有任何名字。如果输入中没有任何参数,lambda将变成如下所示:

代码语言:javascript
复制
() => {return 3;}

如果{}中只有一条语句,则允许您将它写得更短一些,如

代码语言:javascript
复制
() => 3;

最后一步

这是有效密码吗?

代码语言:javascript
复制
void DoNothing()
{

}

TweenCallback x = () => DoNothing();

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

() => DoNothing();是一个lambda (未命名函数),它不需要输入并调用其他函数。它是() => {DoNothing();}的较短版本,您必须认为它是void () {DoNothing();}

所以在写作的时候

代码语言:javascript
复制
animation.OnComplete(() => DestroyOnCompleted(children));

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

Notes

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

票数 1
EN

Stack Overflow用户

发布于 2022-01-12 14:46:17

为什么不?)

我不太了解这个API,但它似乎只是在期待类似的事情

代码语言:javascript
复制
OnComplete(TweenCallback callback)

在这里,您使用的TweenCallback似乎基本上等于c#内置的Action 代表,并且基本上是一个不太空的参数。

代码语言:javascript
复制
public delegate void TweenCallback();

因此,无论您是否将此回调作为兰卜达传递,如

代码语言:javascript
复制
animation.OnComplete(() => DestroyOnCompleted(children));

或者使用类似于运算符的匿名方法

代码语言:javascript
复制
animation.OnComplete(delegate { DestroyOnCompleted(children); });

或者用一种方法

代码语言:javascript
复制
animation.OnComplete(OnCompletedAnimation);
        
...

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

基本上是等价的。

前两者的主要区别是:children 来自何处?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70683171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档