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内部创建的所有对象仍然没有分配。
我有一个 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内部创建的所有对象仍然没有分配。