3

假设我有这门课

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属性EmployeesCopy也会修改原始列表中的属性?

4

6 回答 6

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;
        }
    }
于 2013-03-14T11:39:03.080 回答
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;
}
于 2013-03-14T11:36:37.817 回答
1

为什么EmployeesCopy 的isActive 属性的改变也会修改原来的列表?|

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

于 2013-03-14T11:36:48.850 回答
0

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

于 2013-03-14T11:36:14.507 回答
0

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

于 2013-03-14T11:36:46.757 回答
0

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

于 2013-03-14T11:36:47.437 回答