• 深拷贝与浅拷贝


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

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

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

    案例:

     

    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地址不一样,说明这是深拷贝的

     

  • 相关阅读:
    101. Symmetric Tree
    mfc实现对话框全屏置顶显示
    qq截图原理
    给对话框添加颜色
    mfc设置半透明对话框
    API介绍
    列表控件学习1
    VC++、MFC
    vs2010 产品密钥
    VS2008 视图资源.rc无法加载的问题及解决方法
  • 原文地址:https://www.cnblogs.com/dongqinglove/p/3541844.html
Copyright © 2020-2023  润新知