Enumerable.Range和内存分配

我有以下代码:

IEnumerable elements = Enumerable.Range(1, Int32.MaxValue); Console.WriteLine("Size of System.Int32: {0}", sizeof(int)); Console.Write("Iterating over {0} elements... ", elements.Count()); Parallel.ForEach(elements, _ => { }); Console.WriteLine("Done."); 

打印出:

 > Size of System.Int32: 4 > Iterating over 2147483647 elements... Done. 

但是,我不明白为什么这不会抛出OutOfMemoryException

知道每个int值占用4个字节的空间,分配Int32.MaxValue int数量应该占用~8GB

检查我的申请,这个过程正在采取行动。 ~5.200KB。

元素正在成功迭代,因此必须在某处分配,对吧?

LINQ如何实现这一目标?

IEnumerable不是数组。 它本身不存储任何信息。 实现它的类能够循环一组值。

这里的值不存储在数组中,而不是只是迭代并产生每次迭代的结果。

像这样的东西:

 public IEnumerable GetRange(int start, int number) { for (int i = start; i < start + number; i++) { yield return i; } } 

看,没有数组,没有存储空间。 它只记住迭代器中的当前位置,并可以执行适当的步骤来获取下一个。 此代码由C#编译器动态生成。