当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 20:31:05 C#

C#学习教程:为什么List的副本还是用C#改变了原List中的属性{公共字符串名字{得到;放;}publicstringLastName{get;放;}publicboolisActive{得到;放;}}并像这样使用它:ListEmployees=newList();Employees.Add(newEmployee{FirstName="firstname",LastName="lastname",isActive=true});列出员工Copy=newList(Employees);EmployeesCopy[0].isActive=false;为什么更改EmployeesCopyisActive属性也会修改原始列表中的属性?因为新列表仍然包含对同一雇员对象的引用。您可以通过执行以下操作在新列表中创建新的:ListEmployees=newList();Employees.Add(newEmployee{FirstName="firstname",LastName="lastname",isActive=true});列出EmployeesCopy=Employees.Select(x=>newEmployee(x)).ToList();publicclassEmployee{publicstringFirstName{get;放;}publicstringLastName{get;放;}publicboolisActive{得到;放;}publicEmployee(){}publicEmployee(Employeee){FirstName=e.FirstName;LastName=e.LastName;isActive=e.isActive;你正在做一个浅拷贝,而不是深拷贝。这意味着新列表包含与原始列表中相同的对象。要进行深拷贝,您需要遍历原始列表并为新列表创建新的Employee对象,如下所示。privateListCloneEmployees(Listoriginal){varnewList=newList();foreach(varemployeeinoriginal){newList.Add(newEmployee{FirstName=employee.FirstName,LastName=employee.LastName,isActive=employee.isActive});}返回新列表;为什么更改EmployeesCopy的isActive属性也会修改原始列表?|因为两个列表都指向Employee对象的同一个实例。您还需要深复制Employee对象。副本是一个新的List对象,但它包含对原始列表中同一组Employee对象的引用。如果想让两个列表中的Employee对象独立,就得单独复制一份,然后把副本放在新的列表中。您创建的副本只是列表的副本。不是对象的副本。换句话说,Employees[0]==EmployeesCopy[0]。因为使用newList(Employees);将为您提供List的新实例,但不会提供列表中包含的对象。您还应该考虑克隆列表中包含的对象,使用二进制序列化来序列化对象图。以上是C#学习教程:为什么List的拷贝还是用C#去改变原List中的属性?如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: