前言
在实际开发中,经常会遇到拷贝实例的需求,C#中有两种方式可以实现拷贝,一种是浅拷贝,一种是深拷贝。浅拷贝只会拷贝值类型不会拷贝引用类型。而深拷贝会拷贝值类型和引用类型,可已根据实际情况选择使用哪种拷贝
浅拷贝
浅拷贝需要使要拷贝的类继承ICloneable 接口
首先创建一个继承于浅拷贝的类
class ShallowCopyDemoClass : ICloneable
{
public int intValue = 1;
public string strValue = "1";
public PersonEnum pEnum = PersonEnum.EnumA;
public PersonStruct pStruct = new PersonStruct() {
StructValue = 1 };
public Person pClass = new Person("1");
public int[] pIntArray = new int[] {
1 };
public string[] pStringArray = new string[] {
"1" };
#region ICloneable成员
public object Clone()
{
return this.MemberwiseClone();
}
#endregion
}
class Person
{
public string Name;
public Person(string name)
{
Name = name;
}
}
public enum PersonEnum
{
EnumA = 0,
EnumB = 1
}
public struct PersonStruct
{
public int StructValue;
}
public class FieldsClass
{
public string fieldA;
public string fieldB;
public FieldsClass()
{
fieldA = "A public field";
fieldB = "Another public field";
}
}
测试代码
ShallowCopyDemoClass shallowCopyDemoClass = new ShallowCopyDemoClass();
ShallowCopyDemoClass sCopy = shallowCopyDemoClass.Clone() as ShallowCopyDemoClass;
sCopy.pClass.Name = "2";
sCopy.pEnum = PersonEnum.EnumB;
sCopy.pStruct.StructValue = 2;
sCopy.pIntArray[0] = 2;
sCopy.pStringArray[0] = "2";
//浅拷贝共用值类引用
Console.WriteLine("Class1: {0}", shallowCopyDemoClass.pClass.Name);
Console.WriteLine("Class2: {0}", sCopy.pClass.Name);
Console.WriteLine("Enum1: {0}", shallowCopyDemoClass.pEnum);
Console.WriteLine("Enum2: {0}", sCopy.pEnum);
Console.WriteLine("Struct1: {0}", shallowCopyDemoClass.pStruct.StructValue);
Console.WriteLine("Struct2: {0}", sCopy.pStruct.StructValue);
Console.WriteLine("Array1: {0}", shallowCopyDemoClass.pIntArray[0]);
Console.WriteLine("Array2: {0}", sCopy.pIntArray[0]);
输出如下:

通过输出可以发现,浅拷贝的实列和原来的实列共用引用类型
深拷贝
首先创建需要拷贝的类,方便测试(TestB 和 DeepCopyDemoClass 相互引用)
[Serializable]
public class DeepCopyDemoClass
{

本文详细介绍了C#中浅拷贝和深拷贝的区别,并提供了实现这两种拷贝方式的代码示例。浅拷贝仅复制值类型,而深拷贝同时复制值类型和引用类型。通过反射、表达式目录树和二进制序列化三种方法实现深拷贝,并进行了性能测试。测试结果显示,对于少量拷贝,反射最快,大量拷贝时表达式目录树更优。
最低0.47元/天 解锁文章
2254

被折叠的 条评论
为什么被折叠?



