Пример #1
0
        public static void ShowDeepCloneByReflect()
        {
            PrototypeProduct prototype = new PrototypeProduct();

            prototype.Type = new Type()
            {
                TypeId = 1
            };
            var prototype2 = (PrototypeProduct)prototype.DeepCloneByReflect();

            prototype2.Type.TypeId = 3;
            Console.WriteLine(prototype.Type.TypeId);
            Console.WriteLine(prototype2.Type.TypeId);
        }
Пример #2
0
        /// <summary>
        /// 浅拷贝
        /// </summary>
        public static void Show()
        {
            PrototypeProduct product = new PrototypeProduct
            {
                Name = "product1",
                Num  = 1,
                Type = new Type()
                {
                    TypeId = 1
                }
            };
            var product2 = product.ShallowClone();

            product2.Num         = 2;
            product2.Name        = "product2";
            product2.Type.TypeId = 2;

            //值类型完全拷贝
            Console.WriteLine(product.Num);  //1
            Console.WriteLine(product2.Num); //2

            //不是说引用类型只拷贝地址吗?为什么修改了produtct2的Name值,Product1的值还是原来的呢?
            //引用类型拷贝地址是对的,但是字符串类型有的特殊,因为字符串类型是不可变的。修改product2的Name值相当于新创建了一个string类型的值
            Console.WriteLine(product.Name);  //product1
            Console.WriteLine(product2.Name); //product2

            //引用类型的浅拷贝,这里就体现出来了
            //修改了product2的type,product1中的type也随着改变
            Console.WriteLine(product.Type.TypeId);  //2
            Console.WriteLine(product2.Type.TypeId); //2


            product2.Type = new Type()
            {
                TypeId = 3
            };
            //这里修改了product2中的type值,为什么product中的type没有发生改变呢?
            //因为product2重新创建了一个type,和product中的type指向的不是同一个堆内存空间了
            //上面所提到的字符串可以参考这一条
            Console.WriteLine(product.Type.TypeId);  //2
            Console.WriteLine(product2.Type.TypeId); //3
        }