我有一个类的实例,它有一个存储IEnumerator的数据结构(比如一个List),并且每个枚举器上调用MoveNext()的时间都是t毫秒。
我还有一个" void Add(IEnumerator en)"将IEnumerator添加到数据结构的方法。
如果我有这种形式的IEnumerator方法:
IEnumerator MyMethod()
{
code();
yield return something();
code();
}
调用
时是否会分配任何内容instance.Add(MyMethod())
答案 0 :(得分:1)
请参阅,yield return语句在底层创建一个状态机,因此当您调用该方法时,您实际上并未调用方法MyMethod,而是调用状态机对象。
当您拨打以下内容时,您将获得IEnumerator:
Program p = new Program();
var enumerator = p.MyMethod();
如果你在MyMethod上休息一下,你会看到从未调用过该方法,而是通过它创建了IEnumerator。
现在,如果您将MoveNext调用到枚举器,那么实际上将调用该方法。
因此,在您的情况下,列表将只保存枚举器,并且在您实际检索对象时实际调用会延迟。
在内存分配方面,实际上是分配了状态机,但仍未分配在MyMethod中创建的所有对象。