为什么List的副本仍使用C#更改原始List中的属性

可以说我有这门课

public class Employee { public string FirstName { get; set; } public string LastName { get; set; } public bool isActive { get; set; } } 

并像这样使用它:

  List Employees = new List(); Employees.Add(new Employee { FirstName = "firstname", LastName = "lastname", isActive = true }); List EmployeesCopy = new List(Employees); EmployeesCopy[0].isActive = false; 

为什么更改EmployeesCopy isActive属性还会修改原始列表中的属性?

因为新列表仍包含对同一员工对象的引用。 您可以通过执行以下操作在新列表中创建新的:

  List Employees = new List(); Employees.Add(new Employee { FirstName = "firstname", LastName = "lastname", isActive = true }); List EmployeesCopy = Employees.Select(x => new Employee(x)).ToList(); public class Employee { public string FirstName { get; set; } public string LastName { get; set; } public bool isActive { get; set; } public Employee() { } public Employee(Employee e) { FirstName = e.FirstName; LastName = e.LastName; isActive = e.isActive; } } 

你正在做一个浅拷贝,而不是深拷贝。 这意味着新列表包含原始列表中的相同对象。

要进行深层复制,您需要遍历原始列表并为新列表创建新的Employee对象,如下所示。

 private List CloneEmployees(List original) { var newList = new List(); foreach (var employee in original) { newList.Add(new Employee { FirstName = employee.FirstName, LastName = employee.LastName, isActive = employee.isActive }); } return newList; } 

为什么EmployeesCopy的isActive属性中的更改也会修改原始列表?|

因为这两个列表都指向Employee对象的同一个实例。 您还需要深层复制 Employee对象。

该副本是一个新的List对象,但它包含对原始列表中的同一组Employee对象的引用。 如果希望两个列表中的Employee对象是独立的,则必须单独复制它们并将副本放入新列表中。

您创建的副本只是列表的副本。 不是对象的副本。 换句话说, Employees[0] == EmployeesCopy[0]

因为使用new List(Employees); 将为您提供List的新实例,但不包含列表中包含的对象。 您还应该考虑克隆列表中包含的对象,使用二进制序列化来序列化对象图。