让我说我有这个班级
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool isActive { get; set; }
}
并像这样使用它:
List<Employee> Employees = new List<Employee>();
Employees.Add(new Employee { FirstName = "firstname", LastName = "lastname", isActive = true });
List<Employee> EmployeesCopy = new List<Employee>(Employees);
EmployeesCopy[0].isActive = false;
为什么isActive
的{{1}}属性中的更改还会修改原始列表中的属性?
答案 0 :(得分:3)
因为新列表仍包含对同一员工对象的引用。您可以通过执行以下操作在新列表中创建新的:
List<Employee> Employees = new List<Employee>();
Employees.Add(new Employee { FirstName = "firstname", LastName = "lastname", isActive = true });
List<Employee> 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;
}
}
答案 1 :(得分:1)
你正在做一个浅拷贝,而不是深拷贝。这意味着新列表包含原始列表中的相同对象。
要进行深层复制,您需要遍历原始列表并为新列表创建新的Employee
对象,如下所示。
private List<Employee> CloneEmployees(List<Employee> original)
{
var newList = new List<Employee>();
foreach (var employee in original)
{
newList.Add(new Employee
{
FirstName = employee.FirstName,
LastName = employee.LastName,
isActive = employee.isActive
});
}
return newList;
}
答案 2 :(得分:1)
为什么EmployeesCopy的isActive属性的更改也会修改 原始清单?|
因为这两个列表都指向Employee对象的同一个实例。您还需要deep copy您的Employee对象。
答案 3 :(得分:0)
副本是一个新的List
对象,但它包含对原始列表中同一组Employee
个对象的引用。如果您希望两个列表中的Employee
个对象是独立的,则必须单独复制它们并将副本放入新列表中。
答案 4 :(得分:0)
您创建的副本只是列表的副本。不是对象的副本。换句话说,Employees[0] == EmployeesCopy[0]
。
答案 5 :(得分:0)
因为使用new List<Employee>(Employees);
将为您提供List的新实例,但不包含列表中包含的对象。您还应该考虑克隆列表中包含的对象,使用二进制序列化来序列化对象图。