Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#数组是否保证按顺序存储在内存中?_C#_.net - Fatal编程技术网

C#数组是否保证按顺序存储在内存中?

C#数组是否保证按顺序存储在内存中?,c#,.net,C#,.net,根据互联网上的许多资料来源,在C#中,数组是按顺序存储的。也就是说,如果我有一个指向数组中第一个元素的指针,比如int*start=&array[0],那么我可以通过执行*(start+I)来访问array[I] 但是,我正在查看存储在C:\ProgramFiles(x86)\Microsoft Visual Studio 12.0\VC\Specifications\1033中的C语言规范,我找不到任何地方可以保证这种情况 在实践中,如果说微软和Mono保持它们的实现同步,这可能不是一个问题,

根据互联网上的许多资料来源,在C#中,数组是按顺序存储的。也就是说,如果我有一个指向数组中第一个元素的指针,比如
int*start=&array[0]
,那么我可以通过执行
*(start+I)
来访问
array[I]

但是,我正在查看存储在
C:\ProgramFiles(x86)\Microsoft Visual Studio 12.0\VC\Specifications\1033
中的C语言规范,我找不到任何地方可以保证这种情况

在实践中,如果说微软和Mono保持它们的实现同步,这可能不是一个问题,但我想知道是否有一个官方来源可以保证数组按顺序存储在内存中


谢谢

是的,.NET中的一维零基数组(向量)按顺序存储。事实上,您可以使用带有指针的不安全代码通过递增指针逐个访问数组元素

,第1.8.9.1节介绍了有关阵列的以下内容:

阵列元素应按行主顺序排列在阵列对象内(即,与最右侧阵列维度相关的元素应从最低索引到最高索引连续排列)。为每个阵列元素分配的实际存储可以包括特定于平台的存储 填充物

从:

I.8.9.1阵列类型

阵列元素应在阵列对象内按行排列 顺序(即,与最右边数组关联的元素 尺寸应从最低到最高连续布置 索引)。为每个阵列元素分配的实际存储可以 包括特定于平台的填充。(此存储的大小,单位为) 字节,当sizeof指令应用于 该数组元素的类型。)

因此,是的,在ECMA-335的补充实现中,数组中的公共语言基础设施元素将按顺序排列


但是可能会应用特定于平台的填充,因此64位平台上的实现可能会选择为每个Int32分配64位。

但是,由于允许特定于平台的填充,您不能保证问题中的
*(start+i)
表达式是有效的(尽管实际上是有效的)。Joel Coehoom,我不相信那是真的。它表示存储的大小(包括特定于平台的填充)由sizeof(T)返回,其中T是存储在数组中的元素的类型。这就是做指针运算时使用的方法。你可以这样做,但对于托管语言来说,大多数时候这是一个非常糟糕的主意。