una pila otra metodo lista hacer copiar copia array c# .net properties deep-copy shallow-copy

c# - pila - hacer una copia de un array java



¿Por qué la copia de la lista aún cambia las propiedades en la lista original usando C# (6)

Digamos que tengo esta clase

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

Y úsalo así:

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;

¿Por qué el cambio en la propiedadActive de EmployeesCopy también modifica la propiedad en la lista original?


Estás haciendo una copia superficial, no una copia profunda. Esto significa que la nueva lista contiene los mismos objetos de la lista original.

Para hacer una copia profunda, necesitará repetir su lista original y crear nuevos objetos Employee para la nueva lista, así.

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


La copia es un nuevo objeto List , pero contiene referencias al mismo conjunto de objetos Employee que están en la lista original. Si desea que los objetos del Employee en las dos listas sean independientes, debe copiarlos individualmente y colocar las copias en una nueva lista.


La copia que creas es solo una copia de la lista. No es una copia de los objetos. En otras palabras, Employees[0] == EmployeesCopy[0] .


Porque la nueva lista todavía contiene referencias a los mismos objetos de empleado. Puede crear nuevos en una nueva lista haciendo algo como esto:

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


porque al usar la new List<Employee>(Employees); le dará la nueva instancia de List pero no los objetos contenidos en la lista. También debe considerar la clonación de los objetos contenidos en la lista, use la Serialización Binaria para serializar el gráfico de objetos.


¿Por qué el cambio en la propiedad isActive de EmployeesCopy también modifica la lista original?

Porque tanto la lista apuntan a la misma instancia del objeto Employee. También debe copiar profundamente su objeto Employee.