深拷贝与浅拷贝

拷贝:对象一定有一个副本

深拷:针对所有级别的类型创建独立的副本

浅拷:针对本类型的实例的属性成员进行复制,对象中不包含引用类型成员(除字符串以外)  没有浅拷与深拷之分

案例:

 

namespace 深拷贝与浅拷贝
{
    [Serializable]
    public class MyClass : ICloneable //实现改接口可以很方便的实现浅拷贝
    {
        public string name;

        public Car car;

        public object Clone()
        {
            return MemberwiseClone();//这个是object的受保护的方法,专门创建浅拷贝
        }
        /// <summary>
        ///拷贝方法 
        /// </summary>
        /// <param name="flag">flag为true是浅拷贝,否则为深拷贝</param>
        /// <returns>MyClass</returns>
        public MyClass Copy(bool flag)
        {
            if (flag)
            {
                return Clone() as MyClass; //浅拷贝
            }
            else
            {
                //创建内存流
                using (MemoryStream ms = new MemoryStream())
                {
                    //创建序列化与反序列化对象
                    BinaryFormatter bf = new BinaryFormatter();
                    //序列化当前对象
                    bf.Serialize(ms,this);
                    ms.Position = 0;//将流的当前位置设置成开始位置
                    //反序列化当前对象
                    return bf.Deserialize(ms) as MyClass;
                }
            }
         
        }
    }
}

 

namespace 深拷贝与浅拷贝
{
    [Serializable]
    public class Car
    {
        public string carname;
    }
}
namespace 深拷贝与浅拷贝
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass m1 = new MyClass();
            m1.name = "dongqing";
            m1.car = new Car() { carname = "奥迪A6" };

            //浅拷贝
            MyClass m2 = m1.Copy(true);
            //深拷贝
            MyClass m3 = m1.Copy(false);
        }
    }
}

运行断点调试:

我们可以看到浅拷贝的m2car字段的地址和m1对象的car地址一样(这是浅拷贝的),而m3car字段的地址和m1对象的car地址不一样,说明这是深拷贝的

 

原文地址:https://www.cnblogs.com/dongqinglove/p/3541844.html