深拷贝和浅拷贝
浅拷贝:
值类型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; } } }