请教List问题。

yoyo_fan_503 2010-09-17 02:51:47
假设有 class user .属性为 name 和 password.
user u1 = new user(); u1.name = "1"; u1.password = "123";
user u2 = new user(); u1.name = "2"; u1.password = "12";
user u3 = new user(); u1.name = "3"; u1.password = "1";

List<user> oldList = new List<user>();
List<user> newList = new List<user>();

oldList.Add(u1); oldList.Add(u2); oldList.Add(u3);
newList.Add(u1); newList.Add(u2); newList.Add(u3);

int index = 1;
newList[index].name = "4";

执行完这些之后,oldList[1].name 也会变成 "4"....
这是什么原因呢?

谢谢……!
...全文
127 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 djwkl 的回复:]
两个数组的比较调用的是object类的=比较方法,所以只有当引用相同的时候才会返回true
[/Quote]

谢谢……非常感谢
djwkl 2010-09-17
  • 打赏
  • 举报
回复
两个数组的比较调用的是object类的=比较方法,所以只有当引用相同的时候才会返回true

[Quote=引用 15 楼 yoyo_fan_503 的回复:]

引用 13 楼 yoyo_fan_503 的回复:
顺便请问一下。。。string[3] a 和 string[3] b ...
如果它们的元素都相同
a = b 为什么会返回 false

难道这个也是比较 地址的?
[/Quote]
yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yoyo_fan_503 的回复:]
顺便请问一下。。。string[3] a 和 string[3] b ...
如果它们的元素都相同
a = b 为什么会返回 false
[/Quote]
难道这个也是比较 地址的?
yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 djwkl 的回复:]
你那样写当然可以,但是需要重复输入两遍相同的数据,是error prone的。
我的理解是你这段代码的目的是定义一组user,将其初始状态存储在oldList里面用于保存期状态
对这组user进行一些列操作
将操作完的状态存储在newList里
这样的话,必须保证oldList和newList里面的数据除了在中间操作过程中被修改的地方以外必须完全一致
这种需求,分别定义并给两组use……
[/Quote]
呼呼 对头。俺理解……。谢谢~~~
yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
顺便请问一下。。。string[3] a 和 string[3] b ...
如果它们的元素都相同
a = b 为什么会返回 false
djwkl 2010-09-17
  • 打赏
  • 举报
回复
你那样写当然可以,但是需要重复输入两遍相同的数据,是error prone的。

我的理解是你这段代码的目的是定义一组user,将其初始状态存储在oldList里面用于保存期状态
对这组user进行一些列操作
将操作完的状态存储在newList里
这样的话,必须保证oldList和newList里面的数据除了在中间操作过程中被修改的地方以外必须完全一致
这种需求,分别定义并给两组user赋值显然不是一个好办法。

yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 djwkl 的回复:]
可以考虑吧user类改成struct,struct在栈上,是值类型
引用 6 楼 yoyo_fan_503 的回复:
难道要像下面一样
user oldU1 = new user(); u1.name = "1"; u1.password = "123";
user oldU2 = new user(); u1.name = "2"; u1.password = "12";
……
[/Quote]

嗯嗯 这个明白了。不过我那样子写应该也能实现吧……
火柴没帽 2010-09-17
  • 打赏
  • 举报
回复
引用类型,这样肯定不行的
djwkl 2010-09-17
  • 打赏
  • 举报
回复
可以考虑吧user类改成struct,struct在栈上,是值类型

[Quote=引用 6 楼 yoyo_fan_503 的回复:]

难道要像下面一样
user oldU1 = new user(); u1.name = "1"; u1.password = "123";
user oldU2 = new user(); u1.name = "2"; u1.password = "12";
user oldU3 = new user(); u1.name = "3"; u1.password = "1";
user n……
[/Quote]
wuyq11 2010-09-17
  • 打赏
  • 举报
回复
看看对象的深拷贝浅拷贝
Peter200694013 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vip__888 的回复:]
貌似如梦低调升三星了
[/Quote]
嗯,3个钻了,都没散分
yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
难道要像下面一样
user oldU1 = new user(); u1.name = "1"; u1.password = "123";
user oldU2 = new user(); u1.name = "2"; u1.password = "12";
user oldU3 = new user(); u1.name = "3"; u1.password = "1";
user newU1 = new user(); u1.name = "1"; u1.password = "123";
user newU2 = new user(); u1.name = "2"; u1.password = "12";
user newU3 = new user(); u1.name = "3"; u1.password = "1";
oldList.Add(oldU1); oldList.Add(oldU2); oldList.Add(oldU3);
newList.Add(newU1); newList.Add(newU2); newList.Add(newU3);
yoyo_fan_503 2010-09-17
  • 打赏
  • 举报
回复
呜呜…… 我也觉得是因为这个。可是怎么解决呢?
vip__888 2010-09-17
  • 打赏
  • 举报
回复
貌似如梦低调升三星了
vip__888 2010-09-17
  • 打赏
  • 举报
回复
内存中的地址一样。
wuyq11 2010-09-17
  • 打赏
  • 举报
回复
引用类型,指向同一个对象,修改当然变化
Peter200694013 2010-09-17
  • 打赏
  • 举报
回复
两个list里面都有u2的引用...它们指向堆中同一个user对象

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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