首页 新闻 赞助 找找看

数组浅复制问题

0
悬赏园豆:5 [已解决问题] 解决于 2012-10-28 21:38

string[] arr = {"a","b","c"};
string[] copyArr = (string[])arr.Clone();

执行arr[0] = "p"; 但是copyArr[0]还是a,为什么呢,为什么copyArr没改变呢

Array 的浅表副本仅复制 Array 的元素(无论它们是引用类型还是值类型),但不复制这些引用所引用的对象。新 Array 中的引用与原始 Array 中的引用指向相同的对象

C#
999999999999999的主页 999999999999999 | 初学一级 | 园豆:3
提问于:2012-10-11 22:47
< >
分享
最佳答案
0

你的 赋值操作有误,不管是什么类型,你这样直接赋值,肯定是影响不到原来的值。

arr[0] 是一个引用地址,在堆栈上,指向的“a"在堆上。

 

arr[0]="p" //没有操作到 a,只是将引用地址指向p,不再指向原来的a。

                //而copyArr[0]还是指向原来的a

但是如果你直接 操作a,如 arr[0].Remove(0),由于字符串特殊性,其实a没有变,只是产生了一个新的字符串”“,arr[0]地址没变,指向的还是a,如果换成其它引用对象,就不会了,会改变原来的值。

收获园豆:5
Qlin | 老鸟四级 |园豆:2403 | 2012-10-12 09:29
其他回答(5)
0

string特殊,跟值对象一样,你这样赋值不会改变另外一个string。

换成非值对象数组就可以了。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-11 23:19

你的回答错误,改成int数组,也是一样

int[] arr = {1,2,3};
int[] copyArr = (int[])arr.Clone();

执行arr[0] = 4; 但是copyArr[0]还是1,为什么呢,为什么copyArr没改变呢

支持(0) 反对(0) 999999999999999 | 园豆:3 (初学一级) | 2012-10-11 23:21

@999999999999999: 

--!int也是值对象啊。

class Person{string name}

Person[] arr={new Person{name="123"}};

Person[] copyArr = (Person[])arr.Clone();

arr[0].name="456";

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-12 09:09

@向往-SONG: 你的回答错误,改成任何类型,都是一样,string一点也不特殊。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-10-12 09:30

@水牛刀刀: 

别被他的代码忽悠了,他的愿意是改变对象的值,而不是给数组赋值,string当然改变不了。

换成引用对象,不就能改变对象的值了,见上arr[0].name="456"。

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-12 09:39

@向往-SONG: 我知道,我的意思是“string一点也不特殊”。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-10-12 09:44
0

值类型的数组clone之后, 会生成一个全新的数组 每个值与原来数组里的相同,  这样改变新数组中一个对象的值, 对原来数组没有任何影响。 你用 int数组 就是这种情况。

引用类型的数组clone 之后, 每个数组中的对象还是指向原来数组。 对其中对象做的改变会反映到原来数组上。

gunsmoke | 园豆:3592 (老鸟四级) | 2012-10-12 06:39
0

换成非值对象数组就可以了

jason2013 | 园豆:1998 (小虾三级) | 2012-10-12 08:34
0

应该是字符串的特殊性造成的,你换成其他的引用类型,可以试试

chenping2008 | 园豆:9836 (大侠五级) | 2012-10-12 08:59
0

用数组可能你还不太好理解,这样看:

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。
水牛刀刀 | 园豆:6350 (大侠五级) | 2012-10-12 09:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册