浅复制
1.浅复制是创建一个新对象,并复制原始对象中所有非静态值类型成员和所有引用类型成员的引用,
2.浅复制是通过调用object类的非静态方法MemberwiseClone实现的,该方法创建一个新对象,
然后将当前对象的非静态字段赋值到该新对象。如果字段是值类型的,则对该字段执行逐位赋值;
如果字段是引用各类型的,则赋值引用但不复制引用的对象。
实例:
Tel是一个电话类,Person是一个人员类,它有一个Tel类对象的字段tel,属于引用类型,ShallowCopy方法通过调用 object类MemberwiseClone()方法返回当前Person对象的复制对象。程序的执行结果可以看到,由p2复制到p2采用的是浅复制,两者指向不同的Person实例,而p1.tel和p2.tel总是指向Tel类的同一实例,p2.tel修改了,p1.tel也同步发生了改变。
using System;
using System.Globalization;
namespace ConsoleApp1
{
public class Tel
{
public long telno;
public Tel (long telno)
{
this.telno = telno;
}
}
public class Person
{
public int id;
public string name;
public Tel tel;
public Person ShallowCopy()
{
return (Person)this.MemberwiseClone();
}
public void display()
{
Console.WriteLine("编号{0},姓名{1},电话{2}", id, name, tel.telno);
}
}
class Mainlss
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.id = 101;p1.name = "Mary";p1.tel = new Tel(17737898301);
Console.Write("p1:");
p1.display();
Console.WriteLine("由p1复制到p2");
Person p2 = (Person)p1.ShallowCopy();
Console.WriteLine("p1和p2是否指向同一实例:{0}", object.ReferenceEquals(p1,p2));
Console.Write("p2:");p2.display();
Console.WriteLine("修改p2的信息");
p2.id = 820;p2.name = "Smith";p2.tel.telno = 623452;
Console.Write("p1:");p1.display();
Console.Write("p2:"); p2.display();
Console.ReadKey();
}
}
}
运行结果
p1:编号101,姓名Mary,电话17737898301
由p1复制到p2
p1和p2是否指向同一实例:False
p2:编号101,姓名Mary,电话17737898301
修改p2的信息
p1:编号101,姓名Mary,电话623452
p2:编号820,姓名Smith,电话623452
深复制
深复制和浅复制的区别是对于对象引用成员的处理不同。深复制要在新对象中创建一个与原始对象中对应字段相同的虚拟字段,此引用和原始的引用是不同的。
在Person类的深复制方法DeepCopy中位Person的引用类型的字段tel重新创建了一个Tel实例,着用在Main放啊发中p1.tel
和p2.tel指向不同的Tel实例,两者相互独立。
运行结果
p1:编号101,姓名Mary,电话17737898301
由p1复制到p2
p1和p2是否指向同一实例:False
p2:编号101,姓名Mary,电话17737898301
修改p2的信息
p1:编号101,姓名Mary,电话17737898301
p2:编号820,姓名Smith,电话623452