浅谈对象的深度拷贝 IClonable接口

经常我们会发现,当我们把一个对象列表赋值给另一个对象列表之后,一个改变了,另一个

也跟着改变了,但是这往往不是我们想看到的

那么,怎么办呢?

办法只有一个,那就是让你的对象实现IClonable接口

对象代码:

public class Employee : ICloneable
    {
        public int EmployeeID { getset; }
        public string LastName { getset; }
        public string FirstName { getset; }
        public string Title { getset; }
        public string City { getset; }
        public string Region { getset; }
        public string Country { getset; }
        public string Notes { getset; }

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

运行结果:

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

......

技术改变世界
原文地址:https://www.cnblogs.com/davidgu/p/2528836.html