我有一个像下面的静态数组
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()正在执行深层复制。你能解释一下原因吗?
答案 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对象,因此第一个数组中人物的名称也会改变。