首页 新闻 会员 周边 捐助

C# list 中add 的疑问

0
[已解决问题] 解决于 2016-10-28 09:01

 

为什么 list add 后加进去的 两条数据是不一样,

按理说 这个 tempUSer 引用类型 list 执行add操作 只是在list加了一个引用

还是讲 new  user之后  ,在内存中重新开辟了一个位置??

何必怀念As的主页 何必怀念As | 菜鸟二级 | 园豆:212
提问于:2016-10-26 17:47
< >
分享
最佳答案
0

是的,第一次是开辟了一个,第二次的时候又重新开辟了一个。

奖励园豆:5
路人第十一 | 菜鸟二级 |园豆:323 | 2016-10-26 17:54

你别逗我了

何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-26 17:58

@何必怀念As: 循环了两次,new了两次,开辟了两次内存,只不过第二次的时候tempUser指向了新的这个内存。

路人第十一 | 园豆:323 (菜鸟二级) | 2016-10-26 18:13

list[0]是不会等于list1[0]的,因为user是引用类型,'=='在比较引用类型的时候比较的是在内存中的位置,或者说是不是同一个引用,并不是单纯的比较里面存储的值。

路人第十一 | 园豆:323 (菜鸟二级) | 2016-10-26 18:17

@何必怀念As 你这小伙子我就看不过去了,人家跟你解说好好听着就是,知道什么叫谦虚吗?就你这品行,走不了多远的路的,别得瑟,你知道的那点东西有的人不屑和你解释,既然跟你解释,你就好好学就是!

~扎克伯格 | 园豆:1923 (小虾三级) | 2016-10-26 20:15

@何必怀念As 年轻人问人问题请加上请问,没有人要义务回答你

~扎克伯格 | 园豆:1923 (小虾三级) | 2016-10-26 20:18

@路人第十三: 
这个应该能表达我的意思了把  每次复制都不是给 list 中的地址  而是给 tempUser的地址

何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 08:54

@IT民工-杰:  我懂你的意思,我是需要正确的答案 我会端正态度的,谢啦

何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 09:00

这个

何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 09:10
其他回答(5)
0

你可能是以为tempUser=new user() 只有一行所以只执行了一次吧...

吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-26 17:55

这是什么意思?

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-26 17:57

@何必怀念As: 如果你知道执行了2次.为什么会觉得只new出来一个user对象..

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-26 17:58

@吴瑞祥:  我知道是循环两次 ,问的是list1【0】 为什么不等于list【1】

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-26 17:59

list add 两次都是添加对tempUser的引用啊

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-26 18:01

@何必怀念As: 循环中第一次tempUser的赋值把它指向了名字为tome的user(堆中),然后后面告诉list1,我这里有个地址(栈上),指向堆中的user,你加进去吧,然后list1[0]指向了这个user(堆中)。

第二次,tempUser的指向改为名字为lily的user,然后再告诉list1...。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-26 18:15

@何必怀念As: 看错了,你两次循环都是创建了新user对象,但理解逻辑还是一样。每次创建user对象,tempUser指向它,list[0]再指向它。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-26 18:35

@何必怀念As: tempUser是变量....你以为他是常量吗...你都给他赋值2次了.凭什么他就得是同一个?

不要想太多.如果你想他是同一个.就把new user放到循环外面.那就是你想要的了

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-26 19:54

他本身问的问题就有问题的

支持(0) 反对(0) ~扎克伯格 | 园豆:1923 (小虾三级) | 2016-10-26 20:12

@吴瑞祥:  我知道不是 同一个  我赋值同一个,但是 第二次的应该会覆盖第一次的啊

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 08:55

@Daniel Cai: 你再看我另外发的一个图 现在不是指向某个对象 了把

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 08:58

@何必怀念As: 我知道不是 同一个  我赋值同一个,你自己都说不是同一个了.为什么还赋值同一个

而且你凭什么认为 第二次的应该会覆盖第一次的啊

别纠结这种不在你能力范围内的问题.有这功夫买本C程序设计.从头到尾看完.指针学完也就不会有这种问题了.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-27 08:58

@吴瑞祥:  好吧

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 09:11

@何必怀念As: 第一次循环时

栈                            堆

(tempUser)address1 ----------> user1

                                                 ^

list1[0]----------------------------|

 

第二次循环时

栈                                               堆

list1[0]---------------------------->user1

(tempUser)address2 --------------> user2

                                                       ^

list1[1]--------------------------------|

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-27 10:07
0

每次循环都new了一个新对象,意味着内存又新分配了一块地址,而每次存入的值也都不一样,此时list中是两个不一样的对象不一样的数据,如果每次存入的值一样,此时list中是两个不一样的对象一样的数据。综上所述,你本身问的问题就是有问题的,你只能说这样对象是不同的,数据相不相同要取决在set时给的是什么值。以上纯属个人观点,如有不对的地方,请多包涵!

~扎克伯格 | 园豆:1923 (小虾三级) | 2016-10-26 20:08
-1

巨硬的bug,去提交反馈吧

hahanonym | 园豆:1460 (小虾三级) | 2016-10-27 08:47

什么鬼 

支持(0) 反对(0) 何必怀念As | 园豆:212 (菜鸟二级) | 2016-10-27 08:57
0
pkyou | 园豆:98 (初学一级) | 2016-10-27 16:24
0

循环了两次,new 了两次。类是引用类型,比较的是内存地址。会不相等

如果用的是结构的话,则比较的是值,会每个字段进行比较,结果会相等

小东0 | 园豆:204 (菜鸟二级) | 2018-01-12 12:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册