通用列表是存储在C#中的堆栈还是堆中?

时间:2010-09-13 16:32:08

标签: c# .net arrays list memory-management

通用列表是存储在堆栈还是堆中?

例如

//List of Ints
List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(20);

myInts是存储在堆栈还是堆上?如果我在列表中添加int,是否会发生装箱或拆箱?

3 个答案:

答案 0 :(得分:6)

在C#或.NET中创建对象时,没有“堆”或“堆栈”的概念。虽然列表存储在堆上,但这实际上是CLR如何管理其内存的实现细节。

这里没有拳击或拆箱。这是使用泛型List类而不是非泛型ArrayList的优势。当创建List<int>的新实例时,就好像您编写了一个类,其唯一目的是管理int列表。当从列表中检索到int时,幕后甚至没有任何投射。

答案 1 :(得分:4)

List<T>是参考类型。在内部,它使用T[]。 Array是一种引用类型。引用类型的实例存储在堆上。由于示例中的列表是List<int>,因此它只能保存int并且不会发生装箱。如果您需要将值类型视为引用类型,则会发生拳击。

答案 2 :(得分:0)

对于像int这样的结构,通用列表变得专业化,因此不需要装箱/拆箱。

请注意,值本身仍存储在List的支持数组中。