深拷贝和浅拷贝

浅拷贝:

值类型copy:原值修改不影响copy值。(注:在浅拷贝的时候我们把字符串看成值类型)

引用类型copy:copy的内容是引用类型的引用地址,当原对象发生改动时copy对象也发生改动。

深拷贝:

和浅拷贝相比,区别在于引用类型对象的复制,是将引用复制到新创建的对象中,原对象的改变不会影响复制对象。

深拷贝和浅拷贝代码示例:

    class Studens : ICloneable
    {
        public string Name { get; set; }
        public int Age { get; set; }
        /// <summary>
        /// 浅Clone
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            return this.MemberwiseClone();
        }


        /// <summary>
        /// 深Clone
        ///    深克隆有很多种方式,最简单的就是对对象的每个字段进行挨个赋值,但是一旦Clone对象的字段发生改变的时候Clone方法也要发生改变,非常的不方便和易发生错误。
        ///    在这里我们选择的是序列化Clone的方式
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            //新建一个内存流
            using (Stream streamObj = new MemoryStream())
            {
                //声明二进制格式化对象
                IFormatter formatter = new BinaryFormatter();
                //开始序列化
                formatter.Serialize(streamObj, this);
                //设置当前流的位置,即开始位置。像是一个标识一样,即指向开始读取的位置。( SeekOrigin.Begin流开始的位置,0:偏移位置)
                streamObj.Seek(0, SeekOrigin.Begin);
                //最后反序列化,返回对象
                return formatter.Deserialize(streamObj) as Studens;
            }
        }
    }

 

posted @ 2017-09-04 11:01  诗错り亦染  阅读(155)  评论(0编辑  收藏  举报