如何创建和访问数组

我理解(不完全是为什么)原始类型的实例,如int,float存储在堆栈中,而不是堆分配。 但我对如何存储和访问基元类型的数组感到困惑。 我有这个问题,因为System.Array是一个引用类型。 引用类型是堆分配的。

int[] integers = {1,2,3,4,5}; 

如何在内存中存储和访问这些单个整数?

基本上,你的“理解”是有缺陷的。 值类型值有时存储在堆栈中 – 但不是在数组的一部分或任何其他基于堆的对象时。 不幸的是,有些人选择围绕生活在堆栈上的价值类型做出如此全面的陈述,然后混淆其他人:(

此外, 堆栈/堆的区别是一个实现细节 ……

有关更多详细信息,请参阅我关于内存的文章 ,但请阅读Eric Lippert的博客文章(在前一段中链接)以获得更多哲学考虑。 (阅读他关于价值类型的其他post以获取更多信息。)

您已经发现了“值类型始终存储在堆栈中”的语句显然是错误的原因。 事实是, 存储对象的类型与存储的位置无关 。 正确的规则是具有短寿命的值从短期“堆栈” 存储在存储器中,具有长寿命的值从长期“堆”存储在存储器中

当你这么说时,它实际上是一个重言式。 很明显,短期存储中会分配短暂的东西,并且从长寿存储中分配长寿命的东西! 怎么会这样呢? 但是当你这样说时,显然类型是无关紧要的,除非类型给你一个关于生命的暗示。

int数组的内容可能是长期存在的,因此int是从长期存储中分配的。 int类型的局部变量的内容通常是短暂的,因此通常从短期存储中分配。

数组本身始终是引用类型,因此它存储在堆上。 数组的元素也存储在堆上,但始终存在于连续的内存块中。

Jeffry richter在2002年写的这篇文章非常清楚地解释了这个概念。