我正在使用Unity3D的StartCoroutine方法,我有一个关于嵌套协同程序的问题。
通常,嵌套协同程序可能如下所示:
void Start() { StartCoroutine(OuterCoroutine()); }
IEnumerator OuterCoroutine()
{
//Do Some Stuff . . .
yield return StartCoroutine(InnerCoroutine());
//Finish Doing Stuff . . .
}
IEnumerator InnerCoroutine()
{
//Do some other stuff . . .
yield return new WaitForSeconds(2f);
//Finish Doing that other stuff . . .
}
这一切都很好,但实际上没有必要。可以像这样实现相同的效果:
void Start() { StartCoroutine(OuterCoroutine()); }
IEnumerator OuterCoroutine()
{
//Do Some Stuff . . .
IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator();
while(innerCoroutineEnumerator.MoveNext())
yield return innerCoroutineEnumerator.Current;
//Finish Doing Stuff . . .
}
IEnumerable InnerCoroutine()
{
//Do some other stuff . . .
yield return new WaitForSeconds(2f);
//Finish Doing that other stuff . . .
}
我发现这种方法比拥有多个StartCoroutine产生更少的垃圾(这在Unity中可能是一个问题);因此它非常有用,特别是在处理许多嵌套层时。
现在我的问题是:
而不是使用IEnumerable InnerCoroutine(){}
并获得如下的枚举器:
IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator();
我想使用IEnumerator InnerCoroutine(){}
并获取这样的枚举器:
IEnumerator innerCoroutineEnumerator = InnerCoroutine();
他们是一样的吗?
除了在我的测试中更快,这个方法还允许我通过正常的StartCoroutine方法使用“内部协同程序”方法,这可能会在路上发挥作用。
我已经完成了测试,据我所知,两种技术都有效地做同样的事情,但我在这整个编码事情上仍然相对较新,所以我有可能错过了一些东西。
答案 0 :(得分:1)
实际上,两种写作方式都会产生相同的结果。
这更像是一个C#问题,Unity3D只是在他们的协程系统中使用这些类型。您可能会发现this post answering in more details您的问题。
但是,我不确定你的意思
我发现这种方法产生的垃圾更少(这在Unity中可能是一个问题)
因为两种方法都应该产生相同的结果。在这一点上,它更多的是代码风格的选择。
我个人更喜欢StartCoroutine(InnerCoroutine())
一个班轮,其中InnerCoroutine()
会返回IEnumerator
。我没有看到为InnerCoroutine()
返回IEnumerable并随后获取其枚举器的重点。