List <t>对象</t>的问题

时间:2011-06-24 08:28:04

标签: .net generics collections

List<Person> allPersons= ReadallPersons()

Person aPerson=allPersons[0];

aPerson.Name="test1";

allPersons.Add(aPerson)

allPersons有一个单人对象,我将该人物对象分配到'aPerson'对象。只需将人名重命名为'test1'并再次将其添加到列表中。

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

这有什么问题?

我们如何解决这个问题?

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

您始终使用同一个对象,将其添加到列表中,将其删除,修改,再次添加到第二个位置...

类是引用类型,因此无论您放置多少变量,所有这些变量始终引用内存中的相同对象,并从某处更改它,所有引用都会看到相同的更新数据。

答案 2 :(得分:2)

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

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

答案 3 :(得分: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)?

答案 4 :(得分:0)

当你这样做......

Person aPerson = allPersons[0];

...您正在获取列表中第一个人对象的reference,即它是完全相同的项目,而不是副本。

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