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のと同じオブジェクトのセットへの参照が含まれています。Employee2つのリストのオブジェクトを独立させたい場合はEmployee、それらを個別にコピーして、そのコピーを新しいリストに入れる必要があります。

于 2013-03-14T11:36:14.507 に答える
0

作成するコピーは、リストの単なるコピーです。オブジェクトのコピーではありません。言い換えれば、Employees[0] == EmployeesCopy[0]

于 2013-03-14T11:36:46.757 に答える
0

を使用new List<Employee>(Employees);すると、リストの新しいインスタンスが提供されますが、リストに含まれるオブジェクトは提供されないためです。リストに含まれるオブジェクトのクローン作成も検討する必要があります。バイナリシリアル化を使用してオブジェクトグラフをシリアル化します。

于 2013-03-14T11:36:47.437 に答える