浅复制,指在创建一个对象或结构的副本时,对其值类型字段直接复制值,引用类型字段只复制引用(地址)。
深复制,与浅复制不同的是,对引用类型字段,会创建新的引用,使用新的引用(地址)。
通常直接赋值操作是浅复制操作,若使用深复制,应该实现ICloneable操作,写Clone方法,利用Object.MemberwiseClone方法浅复制后,需要手动编写对其引用对象进行创建新的对象深复制副本。
结构体也是如此,虽然是值类型,若其中包含引用类型字段,想产生一个深复制版本,必须手动实现。
下面是一个测试结构体浅复制的代码:
显示结果:
测试代码中前三个TEST,使s2=s1操作后,s2得到了s1的一个浅复制版本。
TEST 4利用System.Linq提供的扩展方法ToArray创建了数组的一个副本,
使s2是s1的深复制版本,所以演示中对s2的任何修改不会影响s1。
注意:使用ToArray方法,根据情况,增加源数据对象是否为null的判断。