当前位置: 代码迷 >> C# >> 这个有关问题哪位高手能解释一下
  详细解决方案

这个有关问题哪位高手能解释一下

热度:152   发布时间:2016-04-28 08:41:41.0
这个问题谁能解释一下?
List<Model> list = new List<Model>();

Model m = new Model();
m.property = 5;
m.task = "AC";
list.add(m);

m.property = 6;
m.task = "TY";
list.add(m);
如果像以上这样写的话, 发现list里面写入的内容只有
m.property = 5;
m.task = "AC";
后面的内容不会被写入,但是如果改写为以下的话内容可以被正确加载进来。
Model m = new Model();
m.property = 5;
m.task = "AC";
list.add(m);

Model m = new Model();
m.property = 6;
m.task = "TY";
list.add(m); 
为什么必须new一下呢?

------解决思路----------------------
书面上的东西不说了,List中的每一个成员都必须是一个实例,new出一个新的引用类型的实例,就会在堆上分配一个内存空间,你前面的做法就是蛇穿上马甲也不会变成乌龟,他还是原来的堆地址,还是那个对象。
------解决思路----------------------
在model是类的情况下,第一个结果因为引用类型,所以修改的是同一个model
如果model是struct,修改就是复制,所以第一个就是完全不同的两个model
------解决思路----------------------
引用:
Model m = new Model();
m.property = 5;
m.task = "AC";
list.add(m);

m.property = 6;
m.task = "TY";
list.add(m);
如果像以上这样写的话, 发现list里面写入的内容只有
m.property = 5;
m.task = "AC";
后面的内容不会被写入


为什么要New一下前面的人已经说完了
我想说的是如果真的是按你这样的写法,LIST里面必然包含2个元素。如果Model是valuetype,则是property为5和6的两个元素。如果Model是class,则是property都为6的同一个元素
------解决思路----------------------
引用:
不,现在是2个元素,但是Property都是5。

有两个元素是不错的,但你说Property都是5我表示怀疑,应该是6,并且你顶上帖子里说的是值都是
m.property = 5;
m.task = "AC";
但我认为,你的值都应该是下面这两个:
 m.property = 6;
m.task = "TY";
因为你修改了引用类型的实例,应该是将前一个元素的值也修改了,这才会,要不然就是你先后顺序贴反了。
------解决思路----------------------
更正,若Model是struct,输出两个{5,AC},{6,TY}
若是Class,2个都是{6,TY}