c#基础-20深拷贝与浅拷贝

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#基础-20深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。

先说结论:

浅拷贝,在修改类的属性时,值类型在栈上不是同一块内存空间(不变),而引用类型在堆上是同一块内存空间(改变)

深拷贝,在修改类的属性时,值类型和引用类型都不会是同一块内存空间,跟原来没有关系了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        public static void Main()
        {
            //创建P1对象
            Person p1 = new Person();
            p1.Age = 42;
            p1.Name = "Sam";
            p1.IdInfo = new IdInfo("081309207");

            //通过浅复制 得到P2对象
            Person p2 = p1.ShallowCopy();
            //分别输出
            Console.WriteLine("对象P1相关属性如下");
            DisplayValues(p1);
            p1.Name = "dd";
            p1.IdInfo.IdNumber = "1234";
            Console.WriteLine("对象P2相关属性如下");
            DisplayValues(p2);

            //现在测试深复制
            Person p3 = p1.DeepCopy();

            p1.Name = "George";
            p1.Age = 39;
            p1.IdInfo.IdNumber = "081309208";
            Console.WriteLine("对象P1相关属性如下");
            DisplayValues(p1);
            //p1.IdInfo.IdNumber = "CCCCCCC";
            Console.WriteLine("对象P3相关属性如下");
            DisplayValues(p3);
            Console.Read();
        }

        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);
        }
    }

    public class IdInfo
    {
        public string IdNumber;

        public IdInfo(string 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(IdInfo.IdNumber);
            other.Name = String.Copy(Name);
            return other;
        }
    }
}

浅拷贝

			//浅拷贝,复制引用但不复制引用的对象
            return (T)this.MemberwiseClone();

深拷贝

//深拷贝
    [Serializable]
    public class BaseClone<T>
    {
        public virtual T Clone()
        {
            MemoryStream stream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();           
            formatter.Serialize(stream, this);//序列化
            stream.Position = 0;
            return (T)formatter.Deserialize(stream);//反序列
        }
    }

深浅复制主要用于当创建一个对象需要消耗过多资源时,可以采取复制的方法提升效率!

大话设计模式的原话是这样滴:当你New一个对象时,每New一次,都需要执行一个构造函数,如果构造函数的执行时间很长,那么多次New对象时会大大拉低程序执行效率,因此:一般在初始化信息不发生变化的前提下,克隆是最好的办法,这既隐藏了对象的创建细节,又大大提升了性能!

转载:https://www.cnblogs.com/chenwolong/p/MemberwiseClone.html

以上是关于c#基础-20深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

C#对象的深拷贝与浅拷贝

零基础快速掌握JavaScript数组深拷贝与浅拷贝

3-8 Python基础练习题:深拷贝与浅拷贝

iOS之深拷贝与浅拷贝

Python中深拷贝与浅拷贝的区别

Python中list的复制及深拷贝与浅拷贝探究