C# IEnumerator 隐式内存分配

C# IEnumerator implicit memory allocation

我有一个 class 的实例,它有一个存储 IEnumerator(比如一个列表)的数据结构,每 t 毫秒它在每个枚举器上调用 MoveNext()。

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

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

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

当我调用

时是否分配了任何东西
instance.Add(MyMethod())

?

看,yield return 语句在后台创建了一个状态机,因此当您调用该方法时,您实际上并不是在调用方法 MyMethod,而是在调用状态机对象。

当您调用类似以下内容时,您将获得 IEnumerator:

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

如果中断 MyMethod,您将看到该方法从未被调用,而是通过它创建了 IEnumerator。

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

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

在内存分配上,状态机确实分配了,但是在MyMethod内部创建的所有对象仍然没有分配。