c# 关于浅拷贝和深拷贝

 

class Program
{
    static void Main(string[] args)
    {
        //浅拷贝
        Person p1 = new Person();
        p1.Name = "张三";
        p1.Mycar = new Car() { Brand = "奥迪A6" };

        Person p2 = new Person();
        p2.Name = p1.Name;
        p2.Mycar = p1.Mycar; //p1.Mycar 和 p2.Mycar 指向同一个内存地址

        Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand);
        Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand);
        //p1.Mycar:奥迪A6
        //p2.Mycar:奥迪A6

        p1.Mycar.Brand = "奔驰";
        Console.WriteLine("p1.Mycar:" + p1.Mycar.Brand);
        Console.WriteLine("p2.Mycar:" + p2.Mycar.Brand);
        //p1.Mycar:奔驰
        //p2.Mycar:奔驰

        //深拷贝    
        Person p3 = new Person();
        p3.Name = "张三";
        p3.Mycar = new Car() { Brand = "奥迪A6" };

        Person p4 = new Person();
        p4.Name = p3.Name;
        p4.Mycar = new Car() { Brand = p3.Mycar.Brand }; //这里重新创建了Car对象,p3.Mycar 和 p4.Mycar 指向两个不同内存地址

        Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand);
        Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand);
        //p1.Mycar:奥迪A6
        //p2.Mycar:奥迪A6

        p3.Mycar.Brand = "奔驰";
        Console.WriteLine("p3.Mycar:" + p3.Mycar.Brand);
        Console.WriteLine("p4.Mycar:" + p4.Mycar.Brand);
        //p1.Mycar:奔驰
        //p2.Mycar:奥迪A6

        //总结:
        //浅拷贝是共用一个内存地址,当p1改变p2也随着改变。
        //深拷贝是完全重新创建了一个新的对象,当p1改变不会对p2任何影响。

            
        //浅拷贝2
        Person p5 = p1.QianCopy();

        //深拷贝2
        Person p6 = p1.ShenCopy();

        Console.ReadKey();
    }
}

[Serializable]  //添加特性,标记为可序列化。
public class Person
{
    public string Name { get; set; }
    public Car Mycar { get; set; }

    //浅拷贝--通过父类object内部方法MemberwiseClone实现
    public Person QianCopy()
    {
        return (Person)this.MemberwiseClone();
    }
    //深拷贝--通过二进制序列化
    public Person ShenCopy()
    {
        //System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, this); //序列化
        ms.Position = 0;  //注意一点,流的当前位置要回到开头位置
        return (Person)bf.Deserialize(ms); //反序列化
    }
}

[Serializable]
public class Car
{
    public string Brand { get; set; }
}

 

你可能感兴趣的:(c# 关于浅拷贝和深拷贝)