zoukankan      html  css  js  c++  java
  • 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();
            }
    

     测试结果:

  • 相关阅读:
    vs2010 怎样设置文本编辑窗口和解决方案资源管理器同步?
    google浏览器如何导出书签
    C#面试题
    Inkscape tricks
    jupyter-notebook kernel died
    matplotlib 显示中文
    Ubuntu+apt-get update时的源
    vscode设置出错, 无法自动补全
    Ubuntu+vscode打不开
    Ubuntu+Firefox总是打不开网页
  • 原文地址:https://www.cnblogs.com/DCLi/p/Clone.html
Copyright © 2011-2022 走看看