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

array2[0] = 9;

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

这工作正常。Clone()做一个浅拷贝,但是数组类型是值类型,所以它们也被克隆了。

我的问题是这是否在语言规范中是明确的,或者这是否只是当前实现的产物?

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

4

1 回答 1

1

它之所以有效,是因为两个数组绝对不可能共享同一个值类型的实例。

该规范没有具体说明Array.Clone值类型的行为与引用类型的行为方式。但是规范确实说值类型的实例是在赋值时逐位复制的。因此,当array1[i]被复制到时array2[i],您会在 index 处获得实例的克隆i。总是。

但请记住,如果值类型具有引用类型的字段,则只会复制引用 - 而不是引用类型的实例。

我的疑问是 Array 的潜在拳击是否会否定这一点。即,盒装引用被复制而不是基础值类型。

即使array1[i]在克隆过程中被装箱,它也必须被拆箱,这样你最终会得到 aint[]而不是object[]. 该值将在拆箱时被克隆。

于 2014-06-17T16:08:50.547 回答