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是如何存储在c#中的内存中的

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;
    }  
  }