C# ASP.NET 之浅拷贝与深拷贝

写在前面

最近两天,对"树(tree)"进行搜索,将搜索到的结果进行简单处理,并相应的改变样式。因为tree从session中取值,故而每次搜索后处理的结果都会都会改变原有session值。此时,不得不使用“深度复制”的方式去解原数据被修改的问题。

关于浅拷贝与深拷贝

定义

浅拷贝(Shallow Copy)

只复制对象的基本类型、对象类型,仍属于原来的引用。

深拷贝(Deep Copy)

不仅复制对象的基本类型,同时也复制对象的数据,完全产生新对象,是克隆的过程。

区别

浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。

浅拷贝

1.浅拷贝code

public Person ShallowCopy(){
    return this.MemberwiseClone() as Person;//MemberwiseClone:将当前对象浅拷贝一份。
}

2.调用

Person person=new Person();
person.name="张三";
person.age=18;
person.email="1234567890@qq.com;

//浅拷贝
Person person2=person.ShallowCopy();

深拷贝

1.深拷贝code:

public static IList<T> Clone<T>(IList<VehicleTreeModel> list)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (MemoryStream memorystream = new MemoryStream())
    {
        formatter.Serialize(memorystream, list);
        memorystream.Position = 0;
        return formatter.Deserialize(memorystream) as List<T>;
    }
}
2.序列化标识
#+BEGIN_SRC
[Serializable]
public class VehicleTreeModel : CompanyModel
{
   ...
}

[Serializable]
public class CompanyModel
{
   ...
}

3.调用

IList<VehicleTreeModel> deepCopyList = Clone<VehicleTreeModel>(list);

参考资料

http://blog.csdn.net/flyingdream123/article/details/9294973

http://blog.csdn.net/xjavasunjava/article/details/7648242

https://en.wikipedia.org/wiki/Object_copy

结语

此次完全理解了浅度复制和深度复制,并应用于实际当中。