Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#IEnumerator内隐记忆分配_C#_Delegates_Dynamic Memory Allocation_Ienumerator - Fatal编程技术网

C#IEnumerator内隐记忆分配

C#IEnumerator内隐记忆分配,c#,delegates,dynamic-memory-allocation,ienumerator,C#,Delegates,Dynamic Memory Allocation,Ienumerator,我有一个类的实例,它有一个存储IEnumerator(比如一个列表)的数据结构,并且每t毫秒它就会在每个枚举数上调用MoveNext() 我还有一个“void Add(IEnumerator en)”方法,将IEnumerator添加到数据结构中 如果我有此表单的IEnumerator方法: IEnumerator MyMethod() { code(); yield return something(); code(); } 我打电话的时候有分配的吗 insta

我有一个类的实例,它有一个存储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中创建的所有对象仍然没有分配

只有在内部分配内存时才支持Add,否则枚举数只执行只读向前移动操作,类似list implement
MyMethod
的集合返回一个实现
IEnumerable
的对象;在返回该对象之前,必须在某个点分配该对象。