为什么在 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 表达式可以隐式转换为委托。但是你必须明白它们都是不同的东西,在更高级的编码场景中,这种区别不仅仅是纯粹的理论。
我在我的 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 表达式可以隐式转换为委托。但是你必须明白它们都是不同的东西,在更高级的编码场景中,这种区别不仅仅是纯粹的理论。