string[] arr = {"a","b","c"};
string[] copyArr = (string[])arr.Clone();
执行arr[0] = "p"; 但是copyArr[0]还是a,为什么呢,为什么copyArr没改变呢
Array 的浅表副本仅复制 Array 的元素(无论它们是引用类型还是值类型),但不复制这些引用所引用的对象。新 Array 中的引用与原始 Array 中的引用指向相同的对象
你的 赋值操作有误,不管是什么类型,你这样直接赋值,肯定是影响不到原来的值。
arr[0] 是一个引用地址,在堆栈上,指向的“a"在堆上。
arr[0]="p" //没有操作到 a,只是将引用地址指向p,不再指向原来的a。
//而copyArr[0]还是指向原来的a
但是如果你直接 操作a,如 arr[0].Remove(0),由于字符串特殊性,其实a没有变,只是产生了一个新的字符串”“,arr[0]地址没变,指向的还是a,如果换成其它引用对象,就不会了,会改变原来的值。
string特殊,跟值对象一样,你这样赋值不会改变另外一个string。
换成非值对象数组就可以了。
你的回答错误,改成int数组,也是一样
int[] arr = {1,2,3};
int[] copyArr = (int[])arr.Clone();
执行arr[0] = 4; 但是copyArr[0]还是1,为什么呢,为什么copyArr没改变呢
@999999999999999:
--!int也是值对象啊。
class Person{string name}
Person[] arr={new Person{name="123"}};
Person[] copyArr = (Person[])arr.Clone();
arr[0].name="456";
@向往-SONG: 你的回答错误,改成任何类型,都是一样,string一点也不特殊。
@水牛刀刀:
别被他的代码忽悠了,他的愿意是改变对象的值,而不是给数组赋值,string当然改变不了。
换成引用对象,不就能改变对象的值了,见上arr[0].name="456"。
@向往-SONG: 我知道,我的意思是“string一点也不特殊”。
值类型的数组clone之后, 会生成一个全新的数组 每个值与原来数组里的相同, 这样改变新数组中一个对象的值, 对原来数组没有任何影响。 你用 int数组 就是这种情况。
引用类型的数组clone 之后, 每个数组中的对象还是指向原来数组。 对其中对象做的改变会反映到原来数组上。
换成非值对象数组就可以了
应该是字符串的特殊性造成的,你换成其他的引用类型,可以试试
用数组可能你还不太好理解,这样看:
int a = 1; int b = a; a = 2; // 不会影响b string a = "a"; string b = a; a = "xxx"; //不会影响b class Test { public int Number { get; set; } } Test a = new Test { Number = 1 }; Test b = a; a = new Test { Number = 100 }; //依然不会影响b 因为你只是把a指向了堆上一个新的对象,b依然指向旧的对象,你修改的是a,不是a指向的对象,因此不会影响b。