浅谈对象的深度拷贝 - IClonable接口
经常我们会发现,当我们把一个对象列表赋值给另一个对象列表之后,一个改变了,另一个
也跟着改变了,但是这往往不是我们想看到的
那么,怎么办呢?
办法只有一个,那就是让你的对象实现IClonable接口
对象代码:
public class Employee : ICloneable
{
public int EmployeeID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Title { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string Country { get; set; }
public string Notes { get; set; }
public override string ToString()
{
string format = "Employee ID: {0}\nFirst Name: {1}\n"
+ "Last Name: {2}\nTitle: {3}\nCity: {4}\n"
+ "Region: {5}\nCountry: {6}\nNotes: {7}\n";
return string.Format(format, EmployeeID, FirstName, LastName, Title, City, Region, Country, Notes);
}
public Object Clone()
{
Employee cloned = new Employee();
cloned.EmployeeID = this.EmployeeID;
cloned.LastName = this.LastName;
cloned.FirstName = this.FirstName;
cloned.Title = this.Title;
cloned.City = this.City;
cloned.Region = this.Region;
cloned.Country = this.Country;
cloned.Notes = this.Notes;
return cloned;
}
}
{
public int EmployeeID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Title { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string Country { get; set; }
public string Notes { get; set; }
public override string ToString()
{
string format = "Employee ID: {0}\nFirst Name: {1}\n"
+ "Last Name: {2}\nTitle: {3}\nCity: {4}\n"
+ "Region: {5}\nCountry: {6}\nNotes: {7}\n";
return string.Format(format, EmployeeID, FirstName, LastName, Title, City, Region, Country, Notes);
}
public Object Clone()
{
Employee cloned = new Employee();
cloned.EmployeeID = this.EmployeeID;
cloned.LastName = this.LastName;
cloned.FirstName = this.FirstName;
cloned.Title = this.Title;
cloned.City = this.City;
cloned.Region = this.Region;
cloned.Country = this.Country;
cloned.Notes = this.Notes;
return cloned;
}
}
测试代码如下:
public void Run()
{
EmployeesClient employeeClient = new EmployeesClient();
List<Employee> srcEmployeeList = employeeClient.GetAllEmployees();
Console.WriteLine("Source Employee List:");
Console.WriteLine("--------------------------------------------------------------------");
Display(srcEmployeeList);
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine();
Console.WriteLine();
List<Employee> dstEmployeeList = new List<Employee>();
srcEmployeeList.ForEach(emp => dstEmployeeList.Add((Employee)emp.Clone()));
srcEmployeeList[0].LastName = "Huang";
srcEmployeeList[0].FirstName = "Lynn";
Console.WriteLine("Source Employee List After Change:");
Console.WriteLine("--------------------------------------------------------------------");
Display(srcEmployeeList);
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Dest Employee List:");
Console.WriteLine("--------------------------------------------------------------------");
Display(dstEmployeeList);
Console.WriteLine("--------------------------------------------------------------------");
}
private void Display(IList<Employee> employeeList)
{
foreach (Employee employee in employeeList)
{
Console.WriteLine(employee);
}
}
{
EmployeesClient employeeClient = new EmployeesClient();
List<Employee> srcEmployeeList = employeeClient.GetAllEmployees();
Console.WriteLine("Source Employee List:");
Console.WriteLine("--------------------------------------------------------------------");
Display(srcEmployeeList);
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine();
Console.WriteLine();
List<Employee> dstEmployeeList = new List<Employee>();
srcEmployeeList.ForEach(emp => dstEmployeeList.Add((Employee)emp.Clone()));
srcEmployeeList[0].LastName = "Huang";
srcEmployeeList[0].FirstName = "Lynn";
Console.WriteLine("Source Employee List After Change:");
Console.WriteLine("--------------------------------------------------------------------");
Display(srcEmployeeList);
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Dest Employee List:");
Console.WriteLine("--------------------------------------------------------------------");
Display(dstEmployeeList);
Console.WriteLine("--------------------------------------------------------------------");
}
private void Display(IList<Employee> employeeList)
{
foreach (Employee employee in employeeList)
{
Console.WriteLine(employee);
}
}
运行结果:
Source Employee List After Change:
--------------------------------------------------------------------
Employee ID: 1
First Name: Lynn
Last Name: Huang
......
Dest Employee List:
--------------------------------------------------------------------
Employee ID: 1
First Name: Nancy
Last Name: Davolio
......
技术改变世界