int[] array1 = new[] { 1, 2, 3 };
int[] array2 = (int[])array1.Clone();
array2[0] = 9;
Debug.Assert(array1[0] != array2[0]);
这很好用。 Clone()
执行浅层复制,但数组类型是值类型,因此它们也会被克隆。
我的问题是这是否在语言规范中是明确的,还是这只是当前实现的工件?
我的怀疑是由于System.Array
通过运行时泛型在幕后“无形地”支持值类型。查看公共方法,您可以期望将值类型装箱。
答案 0 :(得分:1)
它的工作原理是因为两个数组绝对不可能共享同一个值类型的实例。
规范没有明确说明Array.Clone
对值类型的影响与它与引用类型的行为方式有何关系。但规范确实说,值类型的实例在分配时被逐位复制。因此,当array1[i]
被复制到array2[i]
时,您将获得索引i
的实例的克隆。总是
请注意,如果值类型具有引用类型的字段,则仅复制引用 - 而不是引用类型的实例。
我的查询是Array的潜在装箱是否会否定这一点。即复制盒装引用而不是基础值类型。
即使在克隆过程中装箱array1[i]
,也必须将其取消装箱,以便最终得到int[]
而不是object[]
。该值将在拆箱时克隆。