浅复制与深复制

作者: 黒可乐 | 来源:发表于2016-12-06 20:21 被阅读0次

    最近在看设计模式,看到原型模式,里面讲到了这两个东西,就顺便来仔细研究一下这个。

    怎么说

    浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象引用对任然指向原来的对象。就是改变原来对象引用值是会同时改变复制出来的对象中的值。
    深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。简单的说就是把引用中的值也一起复制了。

    ICloneable

    这个接口是C#系统自带的一个复制的接口,只用实现它就可以了。具体内容如下

    public interface ICloneable{
      object Clone();
    }
    
    实例

    这个是MSDN里给的例子,稍微改动了一下。

    public class IdInfo:ICloneable
    {
        public int IdNumber;
    
        public IdInfo(int IdNumber)
        {
            this.IdNumber = IdNumber;
        }
        public object Clone()//浅复制
        {  
            return (IdInfo)this.MemberwiseClone();
        }
    }
    
    public class Person 
    {
        public int Age;
        public string Name;
        public IdInfo IdInfo;
    
        public Person ShallowCopy()//浅复制
        {
           return (Person) this.MemberwiseClone();
        }
    
        public Person DeepCopy()//深复制
        {
            //new IdInfo的做法
           //Person other = (Person) this.MemberwiseClone();
           //other.IdInfo = new IdInfo(IdInfo.IdNumber);
           //other.Name = String.Copy(Name);
         
            //new Person 的做法
           //Person other =new Person();
           //other.IdInfo =this.IdInfo.Clone();
           //other.Name = String.Copy(Name);
           //other.Age= this.Age;
           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 = 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);
        }
    }
    
    运行结果

    相关文章

      网友评论

        本文标题:浅复制与深复制

        本文链接:https://www.haomeiwen.com/subject/gxmlmttx.html