2013-03-14 28 views
2

可以说我有这个类为什么名单的副本使用C#

public class Employee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public bool isActive { get; set; } 
} 

并使用它像这样还是改变原来的列表属性EmployeesCopy也修改原始列表中的属性?

+3

因为'Employee'是引用类型(类)。 – 2013-03-14 11:36:00

+0

回到书本的时间,以便您清楚地理解参考和值类型之间的差异。这真是**非常重要。确保你得到它。 – spender 2013-03-14 11:36:28

+0

可能是这将帮助你http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types – 1Mayur 2013-03-14 11:36:57

回答

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

它会更好,如果'Employee'实现['IClonable'](http://msdn.microsoft.com/en-us/library/system.icloneable.aspx)。 – Leri 2013-03-14 11:43:20

+0

ICloneable .... – spender 2013-03-14 11:44:25

+2

嗯,我认为在这个层面上,一个拷贝构造函数会就好了。 – laszlokiss88 2013-03-14 11:44:27

0

副本是一个新的List对象,但它包含对原始列表中同一组Employee对象的引用。如果你想在两个列表中Employee对象是独立的,那么你必须单独复制它们,并把复制到一个新的列表。

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; 
} 
0

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

0

,因为通过使用new List<Employee>(Employees);会给你列出的列表中包含的新实例而不是对象。您应该考虑克隆列表中包含的对象,并使用Binary Serialization序列化对象图。

1

为什么更改EmployeesCopy的isActive属性还修改了原始列表 ?

因为无论是单指向Employee对象的同一个实例。您还需要deep copy您的Employee对象。

相关问题