Array.Clone()的奇怪行为

时间:2011-02-23 13:25:08

标签: c#

我有一个像下面的静态数组

static byte[] myArray = {0x01,0x02};

我读到Array.clone does shallow copy。然后我执行以下代码。

byte[] myArray2 = myArray.Clone() as byte[];
myArray2[0] = 0x05;

但现在每个myArray2 [0]和myArray [0]包含不同的值。所以我认为Array.Clone()正在执行深层复制。你能解释一下原因吗?

3 个答案:

答案 0 :(得分:13)

byte是基本类型,而不是引用。因此,在这种情况下,浅拷贝和深拷贝之间没有区别。

尝试使用可变对象类型的数组,您会发现差异。

更新

  

但是byte []是一个引用类型吗?

原始类型的数组是深层次的,最可能由连续的内存块表示,物理上(按值)包含元素。而对象类型的数组是连续的内存块,只包含引用到实际元素(或null s)。因此,当您复制数组时,在第一种情况下,您将获得一个包含原始元素的副本的新数组。因此,在此之后,修改任一阵列中的元素将不会更改另一个阵列的内容。而在第二种情况下,您将获得一个新数组,其中包含原始引用的副本,仍然指向原始数组元素引用的相同对象。因此,如果您修改任何一个数组中的任何元素,那么更改也将在另一个数组中可见。

答案 1 :(得分:1)

浅拷贝意味着它会复制立即值。如果这些值是指针(引用类型,如C#中的对象),那么指针将被复制,并且不会复制它们指向的值(对象的状态)。

如果立即值是基元(即:值本身驻留在数组中,它不是引用)则会复制这些值。因此,行为完全符合预期。

如果您想查看案例中的差异,请定义Object s。

数组

答案 2 :(得分:1)

试试这个:

public class Person
{
    public string Name { get; set; }
}

Person person = new Person { Name = "Vaysage" };

Person[] persons1 = new Person[] { person  };

Person[] persons2 = (Person[])persons1.Clone();

persons2[0].Name = ".NET Junkie";

Assert.AreEqual(persons1[0].Name, ".NET Junkie");

数组被浅层复制。这意味着只复制对Person对象的引用,而不是整个对象。两个数组都引用相同的person对象,因此第一个数组中人物的名称也会改变。