我在团结项目中的C#脚本中使用lambda表达式来调用DOTween回调时带有参数的函数。
它看起来很简单:animation.OnComplete(() => DestroyOnCompleted(children));
它工作得很好,但我知道为什么在本例中使用lambda表达式。我知道这与代表们有关,但除此之外,我不太确定,如果有人问我,我想向我的考试解释一下。
有人能启发我吗?:-)
发布于 2022-01-12 15:06:35
如果您查看文档 of DotTween,您会看到该行:

现在看看源代码 of DotTween,您可以看到TweenCallback的定义:
public delegate void TweenCallback();所以现在的问题是,什么是委托 in c#?
c#中的委托基本上是一个“表示”函数的对象。但是函数并不是完全相同的,它们可以在输入中包含参数并返回某些内容(或者返回空值)。要了解委托所代表的函数类型,只需删除关键字委托即可。
例如,没有键盘委托的TweenCallback是:
public void TweenCaalback()因此,委托表示一个没有输入参数的空函数!(这是公开的)。
这意味着代表一个
这意味着这是有效的代码:
void DoNothing()
{
}
TweenCallback x = DoNothing;
x();因此,您可以向具有相同函数签名的委托“分配函数”。在本例中,TweenCallback是一个委托void (),因此您可以为它分配一个void ()函数。
什么是羔羊?
lambda是该样式的表达式:(string name,int age) => {返回3 };
您可以将其理解为“字符串名称和int年龄返回3”。
这是描述该功能的一种更简洁的方法:
int AnonymousFunction (string name, int age) {}主要的区别是lambdas没有任何名字。如果输入中没有任何参数,lambda将变成如下所示:
() => {return 3;}如果{}中只有一条语句,则允许您将它写得更短一些,如
() => 3;最后一步
这是有效密码吗?
void DoNothing()
{
}
TweenCallback x = () => DoNothing();是的!吐温回调需要一个void ()函数。
() => DoNothing();是一个lambda (未命名函数),它不需要输入并调用其他函数。它是() => {DoNothing();}的较短版本,您必须认为它是void () {DoNothing();}
所以在写作的时候
animation.OnComplete(() => DestroyOnCompleted(children));您只是将一个void ()函数传递给OnComplete方法,这是有意义的,因为TweenCallback是一个void ()委托。
Notes
如您所见,函数和lambda表达式可以被隐式转换为委托。但是你必须明白,它们都是不同的东西,在更高级的编码场景中,这种区别不仅仅是纯理论。
发布于 2022-01-12 14:46:17
为什么不?)
我不太了解这个API,但它似乎只是在期待类似的事情
OnComplete(TweenCallback callback)在这里,您使用的TweenCallback似乎基本上等于c#内置的Action 代表,并且基本上是一个不太空的参数。
public delegate void TweenCallback();因此,无论您是否将此回调作为兰卜达传递,如
animation.OnComplete(() => DestroyOnCompleted(children));或者使用类似于运算符的匿名方法
animation.OnComplete(delegate { DestroyOnCompleted(children); });或者用一种方法
animation.OnComplete(OnCompletedAnimation);
...
private void OnCompletedAnimation()
{
DestroyOnCompleted(children);
}基本上是等价的。
前两者的主要区别是:children 来自何处?
lambda和委托方式允许您从当前作用域变量传入children,而不必将其存储在任何字段中!
https://stackoverflow.com/questions/70683171
复制相似问题