2011-06-24 51 views
0
List<Person> allPersons= ReadallPersons() 

Person aPerson=allPersons[0]; 

aPerson.Name="test1"; 

allPersons.Add(aPerson) 

allPersons有一个单身人士的对象,我分配的那个人对象进入“aPerson” object.Just重命名人名字为“测试1”,并再次将其添加到列表中。问题的列表<T>对象

现在,如果我们检查列表,则两个人的对象的名称都被指定为'test1'。

这是什么问题?

我们如何理清这一点?

+0

如果这应该是C#,则需要双引号字符串并添加一个';' – CodesInChaos

回答

7

您需要复制该对象。您只是将引用复制到同一个对象。所以这两个条目都指向同一个人。

如果Person实现IClonable,则可以调用Clone(),修改克隆并将其添加到列表中。

2

你总是与同一个对象的工作,你把它添加到列表中,把它拿出来,修改它,在第二位置再次添加...

类是引用类型的多少所以不管你把它放在变量中的变量总是引用内存中的同一个对象,并且你从某个地方改变它,所有的引用都会看到相同的更新数据。

0

Person aPerson = allPersons [0]仅复制List中项目的引用。

您需要使用'new'来创建对象的新实例,否则它实际上会复制指针,任何更改都只会影响一个对象。

List allPersons= ReadallPersons() 

**Person aPerson= new Person();** 

aPerson.Name='test1' 

allPersons.Add(aPerson) 

或者您可以执行对象的DeepCopy,请参阅How do you do a deep copy of an object in .NET (C# specifically)?

2

列表存储引用,而不是对象的副本。因此,当您修改对象的名称并对其进行更改时,您将更改列表中的名称以及存储在aPerson中的名称,因为它是同一个对象。

要创建一个新对象,您需要使用new运算符并创建一个新的Person对象,然后将其添加到列表中。

0

当你这样做......

Person aPerson = allPersons[0]; 

...你获得reference以第一人称的对象列表,即它是完全相同的项目,而不是一个副本。

有关如何制作副本,请参阅this question的最佳答案。