List<Person> allPersons= ReadallPersons()
Person aPerson=allPersons[0];
aPerson.Name="test1";
allPersons.Add(aPerson)
allPersons有一个单人对象,我将该人物对象分配到'aPerson'对象。只需将人名重命名为'test1'并再次将其添加到列表中。
现在,如果我们检查列表,那么这个人的对象名称都被指定为'test1'。
这有什么问题?
我们如何解决这个问题?
答案 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的最佳答案,了解如何制作副本。