zoukankan      html  css  js  c++  java
  • 深拷贝与浅拷贝

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

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

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

    案例:

     

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

     

  • 相关阅读:
    在线API文档
    用ScriptEngine在java中和javascript交互的例子(JDK6新特性)
    http status 汇总
    post 方式提交XML文件调用接口
    支持DISTINCT的通用分页存储过程(SQL2005)
    Java 延时常见的几种方法
    JSP 页面打印
    javascript利用拷贝的方法实现导出excel(可以导出表格线)
    JVM(十二),垃圾回收面试题
    JVM(十一),垃圾回收之老年代垃圾收集器
  • 原文地址:https://www.cnblogs.com/dongqinglove/p/3541844.html
Copyright © 2011-2022 走看看