2011-08-14 73 views
10

根据vs:MakeArrayType()的文档表示具有零下限的一维数组。 MakeArrayType(1)表示具有指定维数的数组。 例如,如果底层系统类型为int,返回类型MakeArrayType()System.Int32[],并且返回类型为MakeArrayType(1)System.Int32[*]
这些类型之间有什么区别。.MakeArrayType()和.MakeArrayType(1)之间的区别

+1

最大的交易是C#不直接支持int [*]数组,您必须使用Array。下一个最大的交易是抖动可以为int []生成更好的代码,因为它知道前面只有一个维度。 –

回答

17

如您从返回的类型(Int32[]Int32[*])中看到的,.MakeArrayType().MakeArrayType(1)之间存在细微差异。根据文档.MakeArrayType()

注:公共语言运行时使得矢量 区分(即,一维数组,它们总是从0开始)和 多维数组。矢量总是只有一个维度,与发生在 的多维数组只有一个维度不同。此方法重载只能用于创建矢量类型,并且它是创建矢量类型的唯一方法。 使用MakeArrayType(Int32)方法重载创建 多维数组类型。 Source

所以,当你调用.MakeArrayType()它返回一个向量(这是总有一名维特殊的东西)。调用.MakeArrayType(1)会生成一个多维数组(而不是一个Vector) - 只是它只有一个维度而已。

Vector和Array之间的区别是相当技术性的,但基本上,CLR通过Vector获得特殊处理,所以还有其他IL指令可以与它们一起工作,并且可以使它们更高效。有关数组与矢量之间差异的更多信息,请参阅:http://markettorrent.com/community/7968#Vectors vs. Arrays

+0

很好回答。这引起了我一阵回头:http://marcgravell.blogspot.com/2010/03/when-is-int-not-int.html –

+1

奇怪的东西。即使这里的命名约定也不一致:向量被称为“Int32 [*]”,这些数组被称为“Int32 []”和“Int32 [,]”。 – CodesInChaos

相关问题