1.知识预习
在学习深复制和浅复制前,需要先理清两个概念。引用类型和值类型。对于值类型的复制,我们可以达到深复制的效果。而引用类型,复制新对象后,却都指向了同一个地址,当我们想更改A对象,而对B对象不产生影响,就会很头疼了。。
因此,本文介绍深复制,浅复制,就是针对引用类型的对象而言的。引用类型对象,比较常用的就是class类型的。下面便展开介绍吧。
2.浅复制。
浅复制一般使用this.MemberwiseClone()方法进行clone().我们使用它,主要就是在EF类中,新建这个方法即可。调用方式与一般方法调用一样。就不示例说明了。
3.深复制。
已有一个person类型如下:
class Person
{
private string mName;
private int mGrade;
public int Grade{
get { return mGrade; }
set { mGrade = value; }
}
public string Name
{
get { return mName; }
set { mName = value; }
}
public Person(string _Name, int _Grade)
{
mName = _Name;
mGrade = _Grade;
}
}
3.1 主要常用的深复制方式有两种,第一种是在EF类中,采用硬编码方式,对已有属性进行重新对象赋值。即增加如下方法就可以实现:
public Person Clone()
{
Person person = new Person();
person.Name = this.Name;
person.Grade = this.Grade;
return person;
}
3.2 采用反射方式实现。在主方法中,实现反射方法。
public static object DeepCopy(object _object)
{
Type T = _object.GetType();
object o = Activator.CreateInstance(T);
PropertyInfo[] PI = T.GetProperties();
for (int i = 0; i < PI.Length; i++)
{
PropertyInfo P = PI[i];
P.SetValue(o, P.GetValue(_object));
}
return o;
}
3.3Main方法中测试3.1,3.2中的方法实现。
Person P = new Person("小红", 10);
Person n = (Person)DeepCopy(P);//3.2 反射实现
Person c= P.Clone();//3.1 硬编码方式实现。
P.Grade = 100;
然后,再运行中,观察p,n,c三个对象属性值的不同,可以看到深复制是成功实现的了。