ArrayList Clone问题?

loner 2007-12-23 09:01:39
ArrayList A=new ArrayList();
ArrayList B=new ArrayList();
A.Add("a");
B=(ArrayList)A.Clone();
A[0]="b";
MSDN说ArrayList的Clone是浅拷贝,此时为什么B[0]还是"a"啊?
...全文
269 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
大正他爹 2008-01-01
  • 打赏
  • 举报
回复
可能是线程的执行周期吧。
cc_net 2007-12-27
  • 打赏
  • 举报
回复
写掉了:
Object a =A[0];
Console.Write(a.GetType());

结果是System.String
cc_net 2007-12-27
  • 打赏
  • 举报
回复
我研究了半天,果然是String比较特殊

MSDN上写的:
String 的值一旦创建就不能再修改,所以称它是恒定的。看似能修改 String 的方法实际上只是返回一个包含修改内容的新 String。如果需要修改字符串对象的实际内容,请使用 System.Text.StringBuilder 类。


String a = "aaa"; //a---->“aaa”
String b = a; //a---->“aaa”<---b,传 引用
a ="ccc"; //a是不能被改变的,这里是返回了一个新的string对象
//a--->"ccc" b--->"aaa"


LZ是一样的道理,通过浅拷贝A,B先指向同“a”,后来改变了A="b",A指向了新对象“b”,而B还是指向“a”

这个和值类型看起来可能相识,但完全不同,他分配在线程栈上,传的是值

Int32 a = 1; //a(1)
Int32 b = a; //a(1) b(1)
a = 2;


而和其他引用类型也不同


class ex
{
public int x;
public ex ()
{
this.x = 0;
}
public ex(int x)
{
this.x = x;
}
}

class examlpe
{
static void Main()
{


ex a = new ex(1); //创建新ex对象 a-->1
ex b = a; //传引用,a,b指向同一个实例,a--> 1 <--b
a.x = 2; //和String不同a是可以被修改的,a--> 2 <--b
Console.WriteLine("{0}",a);
Console.WriteLine("{0}",b.);


}
}


这个也可以把ex类实现接口的Clone(){this.MemberwiseClone()....}也是一样的应该。

这是我的理解
gimse7en 2007-12-27
  • 打赏
  • 举报
回复
字符串是特殊的引用类型
Avoid 2007-12-27
  • 打赏
  • 举报
回复
MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

Avoid 2007-12-27
  • 打赏
  • 举报
回复
字符串是一个很特殊的类,不适合测试浅拷贝
Avoid 2007-12-27
  • 打赏
  • 举报
回复
        class Temp
{
public string str = "";
public int n = 0;
}


ArrayList A = new ArrayList();
ArrayList B = new ArrayList();
Temp T = new Temp();
T.str = "a";
T.n = 2;
A.Add(T);
B = (ArrayList)A.Clone();
T.str = "b";
cc_net 2007-12-27
  • 打赏
  • 举报
回复
是啊,我也不明白。
分配的内存结构是什么样的???
downmoon 2007-12-24
  • 打赏
  • 举报
回复


http://topic.csdn.net/t/20040106/08/2636745.html

http://www.codeproject.com/KB/dotnet/Clone.aspx?print=true

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧