System.Array.Clone()是否保证克隆值类型?

时间:2014-06-17 16:03:28

标签: c# .net language-specifications system.array

int[] array1 = new[] { 1, 2, 3 };
int[] array2 = (int[])array1.Clone();

array2[0] = 9;

Debug.Assert(array1[0] != array2[0]);

这很好用。 Clone()执行浅层复制,但数组类型是值类型,因此它们也会被克隆。

我的问题是这是否在语言规范中是明确的,还是这只是当前实现的工件?

我的怀疑是由于System.Array通过运行时泛型在幕后“无形地”支持值类型。查看公共方法,您可以期望将值类型装箱。

1 个答案:

答案 0 :(得分:1)

它的工作原理是因为两个数组绝对不可能共享同一个值类型的实例。

规范没有明确说明Array.Clone对值类型的影响与它与引用类型的行为方式有何关系。但规范确实说,值类型的实例在分配时被逐位复制。因此,当array1[i]被复制到array2[i]时,您将获得索引i的实例的克隆。总是

请注意,如果值类型具有引用类型的字段,则仅复制引用 - 而不是引用类型的实例。

  

我的查询是Array的潜在装箱是否会否定这一点。即复制盒装引用而不是基础值类型。

即使在克隆过程中装箱array1[i],也必须将其取消装箱,以便最终得到int[]而不是object[]。该值将在拆箱时克隆。