IEnumerable是如何存储在c#中的内存中的
本文关键字:内存 存储 何存储 IEnumerable | 更新日期: 2023-09-27 18:21:24
Like Array是顺序内存分配,列表可能会以与链表相同的方式存储在内存中(如果我错了,请纠正我)。IEnumerable是如何存储在c#中的内存中的?假设我有一个类
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
在以下两种情况下,内存分配将如何不同。为什么编译器不允许我们编辑IEnumerables
IList<Employee> EmpList ;
Or
IEnumerables<Employee> EmpList ;
IEnumerable变量存储一个对象引用(作为实现细节,它将是四个或八个字节,具体取决于进程)。System.Collections.Generic.List变量、数组变量、ICollection变量或(尽管与问题无关)任何引用类型变量也是如此。
对象的枚举器产生的数据将被存储,但由引用所指向的对象决定。在某些情况下,它将只存储第一个元素以及枚举器用于计算后续元素的一些信息(例如,System.Linq.Enumerable.Range)。在其他情况下,对象可以是数组或S.C.G.List(顺序存储——列表使用数组进行存储),也可以是链表、哈希集或排序集(分别使用哈希表和二叉树),或者是其他任何人想要实现的东西。
在你关于内存分配的问题中,在内存使用方面没有区别
IList<Employee> empList = new List<Employee>();
和
IEnumerable<Employee> empList = new List<Employee>();
这两者的区别在于可以从empList对象引用中调用对象的方法。在第一种情况下,您仅限于IList中定义的许多成员及其继承的接口,因此您可以更改集合。在第二种情况下,您只能调用GetEnumerator,因此无法更改集合。
这个问题不可能回答。
它取决于实现IEnumerable
的底层对象。
它可以是一个数组,在这种情况下,内存表示就是数组,或者它可以是根据需要生成值的延迟实现的枚举器,在这种情形下,除了该方法中状态机的局部变量之外,它实际上没有内存表示。
IEnumerable
只是一个接口,它所要做的就是
http://msdn.microsoft.com/en-us/library/cc317868.aspx
提供枚举器:
public IEnumerator GetEnumerator()
枚举器的实现可以是不同的,事实上,可能根本没有数据存储:
// Generates 0, 1, 2, ... sequence
public sealed class Sample: IEnumerable {
public IEnumerator GetEnumerator() {
for(int i = 0;; ++i)
yield return i;
}
}