数组与通用列表 - 存储值类型 - 如何存储以及在访问期间内存中会发生什么?

Eve*_*ers 1 .net c#

这是一个简单的问题,但我想了解内存中会发生什么.

我知道将值类型转换为引用类型是装箱.

int I = 10;
object obj = I; // boxing - I is moved from stack to heap
Run Code Online (Sandbox Code Playgroud)

1. int数组的内容:

int[] arrInt = new int[1];
arrInt[0] = 10;
int I = arrInt[0];
Run Code Online (Sandbox Code Playgroud)

在这里,我知道arrInt在堆栈中(带有地址到堆)并且指向堆存储'10'的堆.

在这种情况下,10'盒装'并存储在堆中?或者它作为未装箱的值类型存在?所以,当我重新访问该项目时,int I = arrInt[0]会发生什么?

2. int通用列表的内容:

List<int> lstInt = new List<int>(){10};
int I = lstInt[0];
Run Code Online (Sandbox Code Playgroud)

在通用的情况下List<int>,在msdn文档中,它引用using generic collections avoids the overhead of boxing:" http://msdn.microsoft.com/en-us/library/vstudio/ms172194(v=vs.100).aspx "但我不明白,如果在泛型中List的情况下整数值是如何存储的?这是不是意味着它存在于未装箱状态?那么,在这种情况下,如果我访问int I = lstInt[0],在这种情况下会发生什么?

谢谢.

Ste*_*ven 5

在这种情况下,10'盒装'并存储在堆中?或者它作为未装箱的值类型存在?

由于您定义了一个类型数组,因此该值不会加框int[].

所以当我重新访问该项时,int I = arrInt [0]会发生什么?

在这种情况下,该值直接从数组内的内存位置读取.没有取消装箱.只是一个32位值的简单副本.

但我不明白,如果在泛型中List的情况下整数值是如何存储的?

在后台,List<T>内部将值存储在T[]数组中.所以那里没有拳击比赛.如果您反编译List<T>该类,您将看到其Items属性(索引器)看起来像这样:

public T this[int index]
{
    get
    {
        if (index >= this._size) ThrowHelper.ThrowArgumentOutOfRangeException();
        return this._items[index];
    }
    set
    {
        if (index >= this._size) ThrowHelper.ThrowArgumentOutOfRangeException();
        this._items[index] = value;
        this._version++;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,_items实例字段定义如下:

private T[] _items;
Run Code Online (Sandbox Code Playgroud)

使用泛型集合可以避免拳击的开销

与非泛型版本相比,它避免了拳击的开销ArrayList.在后台ArrayList使用一个object[]数组,导致值类型被装箱.