• 浅拷贝ShallowCopy和深拷贝DeepCopy


    using System;
    
    public class IdInfo
    {
        public int IdNumber;
    
        public IdInfo(int IdNumber)
        {
            this.IdNumber = IdNumber;
        }
    }
    
    public class Person
    {
        public int Age;
        public string Name;
        public IdInfo IdInfo;
    
        public Person ShallowCopy()
        {
            return (Person)this.MemberwiseClone();
        }
    
        public Person DeepCopy()
        {
            Person other = (Person)this.MemberwiseClone();
            other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
            return other;
        }
    }
    
    public class Example
    {
        public static void Main()
        {
            // Create an instance of Person and assign values to its fields.
            Person p1 = new Person();
            p1.Age = 42;
            p1.Name = "Sam";
            p1.IdInfo = new IdInfo(6565);
    
            // Perform a shallow copy of p1 and assign it to p2.
            Person p2 = (Person)p1.ShallowCopy();
    
            // Display values of p1, p2
            Console.WriteLine("Original values of p1 and p2:");
            Console.WriteLine("   p1 instance values: ");
            DisplayValues(p1);
            Console.WriteLine("   p2 instance values:");
            DisplayValues(p2);
    
            // Change the value of p1 properties and display the values of p1 and p2.
            p1.Age = 32;
            p1.Name = "Frank";
            p1.IdInfo.IdNumber = 7878;
            Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
            Console.WriteLine("   p1 instance values: ");
            DisplayValues(p1);
            Console.WriteLine("   p2 instance values:");
            DisplayValues(p2);
    
            // Make a deep copy of p1 and assign it to p3.
            Person p3 = p1.DeepCopy();
            // Change the members of the p1 class to new values to show the deep copy.
            p1.Name = "George";
            p1.Age = 39;
            p1.IdInfo.IdNumber = 8641;
            Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
            Console.WriteLine("   p1 instance values: ");
            DisplayValues(p1);
            Console.WriteLine("   p3 instance values:");
            DisplayValues(p3);
        }
    
        public static void DisplayValues(Person p)
        {
            Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
            Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
        }
    }
    // The example displays the following output:
    //       Original values of p1 and p2:
    //          p1 instance values:
    //             Name: Sam, Age: 42
    //             Value: 6565
    //          p2 instance values:
    //             Name: Sam, Age: 42
    //             Value: 6565
    //       
    //       Values of p1 and p2 after changes to p1:
    //          p1 instance values:
    //             Name: Frank, Age: 32
    //             Value: 7878
    //          p2 instance values:
    //             Name: Sam, Age: 42
    //             Value: 7878
    //       
    //       Values of p1 and p3 after changes to p1:
    //          p1 instance values:
    //             Name: George, Age: 39
    //             Value: 8641
    //          p3 instance values:
    //             Name: Frank, Age: 32
    //             Value: 7878

    转自MSDN:http://msdn.microsoft.com/zh-cn/library/system.object.memberwiseclone.aspx

  • 相关阅读:
    (转)Linux下/etc/rc.local与/etc/init.d的区别与联系
    (转)谈免驱
    (转)获取android源码时repo的错误
    (转)platform_driver_register,什么时候调用PROBE函数 注册后如何找到驱动匹配的设备
    (转)typedef 函数指针的用法
    (转)分析kernel的initcall函数
    (转)Tiny210v2( S5PV210 ) 平台下 FIMD 对应 的 framebuffer 驱动中,关于 video buffer 的理解
    tiny210V2开发板hdmi输出到10.1寸LCD,无图像
    (转)学习linux的几本书
    (转)RGB接口和i80接口的区别
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/3016280.html
Copyright © 2020-2023  润新知