【问题标题】:In C# if an object in a list is added to another list, does changing the object in the second list change the same object in the first list?在 C# 中,如果将列表中的对象添加到另一个列表中,更改第二个列表中的对象是否会更改第一个列表中的相同对象?
【发布时间】:2015-05-01 06:27:05
【问题描述】:

假设我有一个名为 personsPerson 对象 (List<Person>) 列表,如下所示:

class Person
{
    public int PersonId { get; set; } // Unique ID for the person loaded from database
    public string Name { get; set; }
}

// In a different class
public List<Person> Persons = new List<Person>(); // Person objects are subsequently added to the list

然后我从列表中选择一些Person 对象,按属性对它们进行排序(例如,按每个人的唯一ID PersonId),然后将这些选定的Person 对象添加到另一个名为selectedPersons 的列表中.
我现在需要编辑位于selectedPersons 中的Person 对象的属性,但需要对persons 中此Person 对象的原始副本进行这些更改。我目前只知道此人在selectedPersons 列表中的索引,所以我可以简单地编辑selectedPersons 列表中的人并将对该人所做的更改反映在原始persons 列表中强>,像这样:

selectedPersons[selectedPersonIndex].Name = "John";

我是否必须编辑persons 列表中的原始Person 对象,首先使用人的ID 在persons 列表中查找该人的索引,如下所示:

persons[FindPersonIndexById(selectedPersons[selectedPersonIndex].BookingId).Name = "John";

其中FindPersonIndexById 返回persons 中 ID 与给定 ID 匹配的人的索引。
我知道列表是 C# 中的引用类型,但是,当一个列表中的对象添加到另一个列表中时,我不确定对第二个列表中的对象所做的更改是否会自动对第一个列表中的相同对象进行

【问题讨论】:

  • 您有 2 个不同的 List 实例...但它们包含对同一个人对象的引用。因此,您对任何列表中的任何人所做的任何更改,都会在两个列表中修改相同的人对象。
  • 你为什么不简单地测试一下?
  • 这么简单的几行代码,为什么要在这里提问?
  • @DavidG 是的,我想是的,尽管在这里问我确切地知道为什么某些东西以特定的方式起作用,而不仅仅是那个它起作用

标签: c# list object reference-type


【解决方案1】:

由于 Person 是一个引用类型(类),更改列表中项目的名称将更改 Person 对象的名称,并且对该对象的所有引用现在都将看到新名称。如果它是一个结构,那就不是这样了。

【讨论】:

    【解决方案2】:

    当您有一个对象列表是引用类型而不是值类型时,存储在列表中的是列表中每个对象的引用。因此,如果您将相同的对象添加到两个不同的列表中,实际上您将相同的引用添加到第二个列表中。因此,如果您对对象进行任何更改,这将从两个列表中“可见”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2016-11-18
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多