C# “与”的区别是什么;收益率回报率0“;及;收益率返回空值“;在协同程序中?

C# “与”的区别是什么;收益率回报率0“;及;收益率返回空值“;在协同程序中?,c#,unity3d,yield,coroutine,ienumerator,C#,Unity3d,Yield,Coroutine,Ienumerator,我是新手,对“yield”有点困惑。但我终于明白了使用WaitForSeconds 但是我看不出“收益率返回0”和“收益率返回null”之间的区别 它们都在等待下一帧执行吗 对不起,我的英语不好。非常感谢。您甚至可以“收益回报”;我认为,关于合作计划,最终结果是一样的 屈服返回类似于说“立即将控制权返回给调用者,但当我再次被调用时,从我以前的状态继续”屈服返回0和屈服返回null都会对单个帧屈服。最大的区别是yield return 0分配内存,因为0在引擎盖下进行装箱和拆箱,但是yield r

我是新手,对“
yield
”有点困惑。但我终于明白了使用
WaitForSeconds

但是我看不出“
收益率返回0
”和“
收益率返回null
”之间的区别

它们都在等待下一帧执行吗

对不起,我的英语不好。非常感谢。

您甚至可以“收益回报”;我认为,关于合作计划,最终结果是一样的


屈服返回类似于说“立即将控制权返回给调用者,但当我再次被调用时,从我以前的状态继续”

屈服返回0和屈服返回null都会对单个帧屈服。最大的区别是
yield return 0
分配内存,因为
0
在引擎盖下进行装箱和拆箱,但是
yield return null
不分配内存。因此,如果您关心性能,强烈建议使用
yield return null

这不是
yield break
?据我所知,
yield-return
总是需要一个表达式。在这种情况下,也不会有连续性,因为枚举器已经完成了
的yield break
,这不会编译。这对UnityScript是有效的。@Everts C#只是在这个问题中被标记了+他没有提到会让很多人困惑的问题,这些人会遇到这个答案。@YuvalItzchakov迭代器块可以用来创建返回
IEnumerable
的方法,但是unity协同程序将是
IEnumerable
,而不是
IEnumerable
@YuvalItzchakov,你打算用这个常量表达什么意思?这里的值的要点是它不是一个值,这正是
null
的语义。你还想表达什么语义<代码>收益率突破完全错误。它不能正常工作。他需要暂停到下一帧,而不是结束协同程序。至于性能,你认为毫无意义地执行一个以(当然,相当小的)成本为零增加价值的操作是毫无理由的。您是否只是随机地在代码中插入
Thread.SpinWait
“因为它不是一个热路径,所以不重要”而不需要任何理由?此外,这种屈服将在整个应用程序中进行,因此几乎可以肯定,它实际上会出现在许多热门路径中。@YuvalItzchakov我不是在做假设,我只是利用了Unity协同程序的一些基本知识。这里的惯用行为是产生
null
。这绝对不会出错。假设这是一个值序列,而事实并非如此。这不是unity使用迭代器的方式
null
是返回的最有意义的值,因为关键是“无意义的值”是生成的值,而
null
实际上最能代表这些语义。当然比一个没有意义的数字要好。@YuvalItzchakov这个问题是为了统一。它上面有Unity标记,而不是WPF或WinForm。团结是一个游戏引擎。你不能像在普通的C#应用程序中那样编程,不关心内存分配。例如,如果您在while循环中使用
制作动画并返回0
,然后将脚本附加到50多个游戏对象上,这将导致垃圾收集器更频繁地发生,导致游戏在某个特定点冻结和解冻。这在iOS或Android上不好。你可以称之为微优化或不必要,但事实并非如此。