C# 浅拷贝与深拷贝

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

前言

在实际开发中,经常会遇到拷贝实例的需求,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
{
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值