• 浅复制和深复制


    浅复制:

    被复制对象的所有变量都含有与原来的对象相同的值,而其所有的对其他对象的引用都仍然指向原来的对象。

    补充:

    一个对象中的字段有的是值类型的,有的是引用类型的。对于值类型字段来说,它的值就是简单的值,而对于引用类型来说,它的值是地址。

    浅复制在复制时,将这个对象的值字段和引用字段(均为非静态字段)全部复制过去,获得了这个对象的值和地址。

    即:当其中一个对象的引用字段所指向的地址中的变量变化时,所有浅复制对象中的该引用字段都会发生变化。

    例子:

    基础类:

    public class Person
    {
        public string Name { get; set; }
    
        public int Age { get; set; }
    }
    
    public class BaseClass
    {
        //值类型
        public int Grade
        {
            get;
            set;
        }
    
        /// <summary>
        /// 引用类型
        /// </summary>
        public Person P
        {
            get;
            set;
        }
    
        public BaseClass Clone()
        {
            return (BaseClass)this.MemberwiseClone();
        }
    }

    页面:

    public partial class calculate_Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            BaseClass bc1 = new BaseClass() { Grade = 1, P = new Person() { Age = 20, Name = "www" } };
    
            BaseClass bc2 = bc1;
    
            BaseClass bc3 = bc1.Clone();
    
            //True
            Response.Write((bc1 == bc2).ToString() + "<br/>");
    
            //False
            Response.Write((bc1 == bc3).ToString() + "<br/>");
    
            //False
            Response.Write((bc2 == bc3).ToString() + "<br/>");
    
    
            bc1.P.Name = "Changed";
    
            //Changed
            Response.Write(bc1.P.Name + "<br/>");
    
            //Changed
            Response.Write(bc2.P.Name + "<br/>");
    
            //Changed
            Response.Write(bc3.P.Name + "<br/>");
        }
    }

    深复制:

    被复制对象会将所有非引用类型的字段复制给新对象,同时将引用类型所指向地址中存的对象复制给新的对象。

    基础类:

    public class Person
    {
        public string Name { get; set; }
    
        public int Age { get; set; }
    
        public Person Clone()
        {
            return (Person)this.MemberwiseClone();
        }
    }
    
    public class BaseClass
    {
        //值类型
        public int Grade
        {
            get;
            set;
        }
    
        /// <summary>
        /// 引用类型
        /// </summary>
        public Person P
        {
            get;
            set;
        }
    
        /// <summary>
        /// 增加此空构造函数是为了使对象初始化器使用
        /// </summary>
        public BaseClass()
        {
    
        }
    
        /// <summary>
        /// 此为内部复制引用类型字段使用,
        /// 注意:Person类增加了一个方法
        /// </summary>
        /// <param name="p"></param>
        BaseClass(Person p)
        {
            this.P = p.Clone();
        }
    
        public BaseClass Clone()
        {
            BaseClass bc = new BaseClass(this.P);
            bc.Grade = this.Grade;
            return bc;
        }
    }

    页面代码:

    public partial class calculate_Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            BaseClass bc1 = new BaseClass() { Grade = 1, P = new Person() { Age = 20, Name = "www" } };
    
            BaseClass bc2 = bc1;
    
            BaseClass bc3 = bc1.Clone();
    
            //True
            Response.Write((bc1 == bc2).ToString() + "<br/>");
    
            //False
            Response.Write((bc1 == bc3).ToString() + "<br/>");
    
            //False
            Response.Write((bc2 == bc3).ToString() + "<br/>");
    
    
            bc1.P.Name = "Changed";
    
            //Changed
            Response.Write(bc1.P.Name + "<br/>");
    
            //Changed
            Response.Write(bc2.P.Name + "<br/>");
    
            //www
            Response.Write(bc3.P.Name + "<br/>");
        }
    }

    区别:

    浅复制和深复制的区别仅在于对引用类型的对待上,一个是复制的地址,一个是复制的地址指向位置的数据.

  • 相关阅读:
    用jQuery File Upload做的上传控件demo,支持同页面多个上传按钮
    从炉石传说的一个自杀OTK说起
    DTCMS插件的制作实例电子资源管理(二)Admin后台页面编写
    DTCMS插件的制作实例电子资源管理(一)插件目录结构
    一个看似很简单的SQL却难倒了很多人
    一个js验证类
    elasticsearch节点间通信的基础transport
    elasticsearch cluster 详解
    elasticsearch cluster 概述
    Node组装启动过程
  • 原文地址:https://www.cnblogs.com/oneword/p/1781859.html
Copyright © 2020-2023  润新知