• C#浅拷贝与深拷贝测试


    1.浅拷贝与深拷贝

      浅拷贝:只复制对象的基本类型,对象类型,仍属于原来的引用. 
          深拷贝:不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

    2.浅拷贝与深拷贝的区别

       浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原始对象中,也就是说原始对象中对应的字段也会发生变化。

           深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。

    3.浅拷贝与深拷贝测试

        public class TestClass
        {
            public TestClass()
            {
                this.Num = 1;
                this.Remark = "r";
                this.Data = new Data { Name = "a", SortNum = 1 };
            }
    
            public int Num { get; set; }
            public string Remark { get; set; }
            public Data Data { get; set; }
    
            //浅拷贝
            public TestClass Clone()
            {
                return (TestClass)this.MemberwiseClone();
            }
    
            //深拷贝
            public TestClass DeepClone()
            {
                TestClass t = new TestClass();
                t.Num = this.Num;
                t.Remark = this.Remark;
                t.Data = new Data { Name = this.Data.Name, SortNum = this.Data.SortNum };
                return t;
            }
        }
    
        public class Data
        {
            public string Name { get; set; }
            public int SortNum { get; set; }
        }
    

     测试代码:

     static void Main(string[] args)
            {
                TestClass t1 = new TestClass();
                TestClass t2 = t1.Clone();
                TestClass t3 = t1.DeepClone();
                t1.Num = 2;
                t1.Remark = "r2";
                t1.Data.SortNum = 2;
                t1.Data.Name = "b";
    
                Console.WriteLine("t1   num:{0} remark:{1} name:{2} sortnum:{3}", t1.Num,t1.Remark, t1.Data.Name, t1.Data.SortNum);
                Console.WriteLine("t2   num:{0} remark:{1} name:{2} sortnum:{3}", t2.Num,t2.Remark, t2.Data.Name, t2.Data.SortNum);
                Console.WriteLine("t3   num:{0} remark:{1} name:{2} sortnum:{3}", t3.Num,t3.Remark, t3.Data.Name, t3.Data.SortNum);
               
                Console.ReadLine();
            }
    

     测试结果:

  • 相关阅读:
    从联想昭阳到MacBook Pro,致我的那些败家玩意——电脑
    讲真,这两款idea插件,能治愈你英语不好的病
    大专学历以后就职会不会有瓶颈
    恕我直言,我怀疑你并不会生成随机数
    一文教会你如何在 Spring 中进行集成测试,太赞了
    30岁开始学编程晚吗?
    delphi下TList的用法
    在Delphi下基于MapWinGIS添加和删除图层标注的方法
    SMS模型格网转换为MIKE21的格网源代码
    样条曲线的Fortran程序
  • 原文地址:https://www.cnblogs.com/DCLi/p/Clone.html
Copyright © 2020-2023  润新知