zoukankan      html  css  js  c++  java
  • 浅谈对象的深度拷贝 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

    ......

    技术改变世界
  • 相关阅读:
    visual studio disable git
    app常见性能测试点
    App测试流程及测试点(个人整理版)
    APP测试要点
    APP端测试常见的功能点
    一文搞懂性能测试常见指标
    为什么会有生产bug?
    线上出了bug,是谁的责任?
    生产上线发现重大Bug的思考
    项目上线后出现Bug,该如何处理?
  • 原文地址:https://www.cnblogs.com/davidgu/p/2528836.html
Copyright © 2011-2022 走看看