【问题标题】:Problem with List<T> objectList<T> 对象的问题
【发布时间】:2011-06-24 08:28:03
【问题描述】:
List<Person> allPersons= ReadallPersons()

Person aPerson=allPersons[0];

aPerson.Name="test1";

allPersons.Add(aPerson)

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

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

这有什么问题?

我们如何解决这个问题?

【问题讨论】:

  • 如果这应该是 C# 你需要双引号字符串并添加一个;

标签: .net generics collections


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你总是在处理同一个对象,你将它添加到列表中,取出它,修改它,再次将它添加到第二个位置......

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

    【讨论】:

      【解决方案3】:

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

      要创建一个新对象,你需要使用 new 操作符创建一个新的 Person 对象,然后将其添加到列表中。

      【讨论】:

        【解决方案4】:

        当你这样做时......

        Person aPerson = allPersons[0];
        

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

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

        【讨论】:

          【解决方案5】:

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

          您将需要使用“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)?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-03
            • 2021-11-12
            • 2010-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多