可以说我有这个类为什么名单的副本使用C#
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool isActive { get; set; }
}
并使用它像这样还是改变原来的列表属性EmployeesCopy
也修改原始列表中的属性?
可以说我有这个类为什么名单的副本使用C#
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool isActive { get; set; }
}
并使用它像这样还是改变原来的列表属性EmployeesCopy
也修改原始列表中的属性?
由于新的列表中仍然包含对同一员工对象的引用。您可以通过执行如下操作在新列表中创建新列表:
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;
}
}
它会更好,如果'Employee'实现['IClonable'](http://msdn.microsoft.com/en-us/library/system.icloneable.aspx)。 – Leri 2013-03-14 11:43:20
ICloneable .... – spender 2013-03-14 11:44:25
嗯,我认为在这个层面上,一个拷贝构造函数会就好了。 – laszlokiss88 2013-03-14 11:44:27
副本是一个新的List
对象,但它包含对原始列表中同一组Employee
对象的引用。如果你想在两个列表中Employee
对象是独立的,那么你必须单独复制它们,并把复制到一个新的列表。
你正在做一个浅拷贝,而不是一个深拷贝。这意味着新列表包含原始列表中的相同对象。
做一次深层副本,则需要通过你的原始列表进行迭代做出新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;
}
您创建的副本只是列表的副本。不是对象的副本。换句话说,Employees[0] == EmployeesCopy[0]
。
,因为通过使用new List<Employee>(Employees);
会给你列出的列表中包含的新实例而不是对象。您应该考虑克隆列表中包含的对象,并使用Binary Serialization序列化对象图。
为什么更改EmployeesCopy的isActive属性还修改了原始列表 ?
因为无论是单指向Employee对象的同一个实例。您还需要deep copy您的Employee对象。
因为'Employee'是引用类型(类)。 – 2013-03-14 11:36:00
回到书本的时间,以便您清楚地理解参考和值类型之间的差异。这真是**非常重要。确保你得到它。 – spender 2013-03-14 11:36:28
可能是这将帮助你http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types – 1Mayur 2013-03-14 11:36:57