C#IEnumerator隐式内存分配

时间:2017-10-03 18:08:24

标签: c# delegates dynamic-memory-allocation ienumerator

我有一个类的实例,它有一个存储IEnumerator的数据结构(比如一个List),并且每个枚举器上调用MoveNext()的时间都是t毫秒。

我还有一个" void Add(IEnumerator en)"将IEnumerator添加到数据结构的方法。

如果我有这种形式的IEnumerator方法:

IEnumerator MyMethod()
{
     code();
     yield return something();
     code();
}

调用

时是否会分配任何内容
instance.Add(MyMethod())

1 个答案:

答案 0 :(得分:1)

请参阅,yield return语句在底层创建一个状态机,因此当您调用该方法时,您实际上并未调用方法MyMethod,而是调用状态机对象。

当您拨打以下内容时,您将获得IEnumerator:

Program p = new Program();
var enumerator = p.MyMethod();

如果你在MyMethod上休息一下,你会看到从未调用过该方法,而是通过它创建了IEnumerator。

现在,如果您将MoveNext调用到枚举器,那么实际上将调用该方法。

因此,在您的情况下,列表将只保存枚举器,并且在您实际检索对象时实际调用会延迟。

在内存分配方面,实际上是分配了状态机,但仍未分配在MyMethod中创建的所有对象。