zoukankan      html  css  js  c++  java
  • 正确实现浅拷贝和深拷贝

      浅拷贝和深拷贝的区别:
      浅拷贝:
      修改副本的值类型字段不会影响源对象对应的字段,修改副本的引用类型字段会影响源对象,因为源对象复制给副本对象的时候,是引用类型的引用地址,也就是两者引用的是同一个对象。
      深拷贝:
      无论值类型还是引用类型的字段,修改副本对象不会影响源对象,即使是引用类型,也是重新创建了一个新的对象引用。
      要想自定义类型具有Clone拷贝的能力,就得继承ICloneable接口,然后根据需求,实现Clone方法以便实现浅拷贝或者深拷贝。
      浅拷贝示例:
      namespace WebApplication
      {
      public class Employee : ICloneable
      {
      public string IDCode { get; set; }
      public int Age { get; set; }
      public Department Department { get; set; }
      //实现ICloneable接口成员
      public object Clone()
      {
      return this.MemberwiseClone();
      }
      }
      public class Department
      {
      public string Name { get; set; }
      public override string ToString()
      {
      return this.Name;
      }
      }
      public partial class WebForm1 : System.Web.UI.Page
      {
      protected void Page_Load(object sender, EventArgs e)
      {
      //初始化Employee对象employeeA
      Employee employeeA = new Employee() { IDCode = "A", Age = 10, Department = new Department() { Name = "DepartmentA" } };
      //从employeeA 浅拷贝出 employeeB
      Employee employeeB = employeeA.Clone() as Employee;
      //修改employeeB对象的属性
      employeeA.IDCode = "B";
      employeeA.Age = 15;
      employeeA.Department.Name = "DepartmentB";
      //输出以便验证
      Response.Write(employeeB.IDCode); // A
      Response.Write(employeeB.Age); //10
      Response.Write(employeeB.Department.ToString()); //DepartmentB
      }
      }
      }
      从输出结果可以验证得到结果:
      1、IDCode即使是string引用类型,Object.MemberwiseClone 依然为其创造了副本,在浅拷贝中,我们可以将string当做值类型来看待。
      2、Employee的Department属性是引用类型,改变源对象employeeA中的值,会影响到副本对象employeeB
      浅拷贝和深拷贝的区别托福答案 www.yztrans.com
      浅拷贝:
      修改副本的值类型字段不会影响源对象对应的字段,修改副本的引用类型字段会影响源对象,因为源对象复制给副本对象的时候,是引用类型的引用地址,也就是两者引用的是同一个对象。
      深拷贝:
      无论值类型还是引用类型的字段,修改副本对象不会影响源对象,即使是引用类型,也是重新创建了一个新的对象引用。
      要想自定义类型具有Clone拷贝的能力,就得继承ICloneable接口,然后根据需求,实现Clone方法以便实现浅拷贝或者深拷贝。
      浅拷贝示例:
      namespace WebApplication
      {
      public class Employee : ICloneable
      {
      public string IDCode { get; set; }
      public int Age { get; set; }
      public Department Department { get; set; }
      //实现ICloneable接口成员
      public object Clone()
      {
      return this.MemberwiseClone();
      }
      }
      public class Department
      {
      public string Name { get; set; }
      public override string ToString()
      {
      return this.Name;
      }
      }
      public partial class WebForm1 : System.Web.UI.Page
      {
      protected void Page_Load(object sender, EventArgs e)
      {
      //初始化Employee对象employeeA
      Employee employeeA = new Employee() { IDCode = "A", Age = 10, Department = new Department() { Name = "DepartmentA" } };
      //从employeeA 浅拷贝出 employeeB
      Employee employeeB = employeeA.Clone() as Employee;
      //修改employeeB对象的属性
      employeeA.IDCode = "B";
      employeeA.Age = 15;
      employeeA.Department.Name = "DepartmentB";
      //输出以便验证
      Response.Write(employeeB.IDCode); // A
      Response.Write(employeeB.Age); //10
      Response.Write(employeeB.Department.ToString()); //DepartmentB
      }
      }
      }
      从输出结果可以验证得到结果:
      1、IDCode即使是string引用类型,Object.MemberwiseClone 依然为其创造了副本,在浅拷贝中,我们可以将string当做值类型来看待。
      2、Employee的Department属性是引用类型,改变源对象employeeA中的值,会影响到副本对象employeeBSAT答案 www.yzyxedu.com
     

  • 相关阅读:
    mysql执行顺序及习题
    多表查询
    PyQt5-03-信号与槽
    PyQt5-01-安装及简单例子
    252.anaconda升级版本
    251.anaconda下载资源包慢
    250.anaconda+vscode
    61.基础语法-函数式编程
    60.基础语法-异常的处理
    59.语法基础-包
  • 原文地址:https://www.cnblogs.com/haosola/p/3667651.html
Copyright © 2011-2022 走看看