C# 浅拷贝与深拷贝

浅拷贝(shallow copy)指的是当对象的字段被拷贝的时候,字段应用的对象不会被拷贝。

深拷贝是对对象实例当中的字段引用的对象也进行拷贝的一种方式。


浅拷贝可以通过将类实现接口ICloneable

Class MyClass:ICloneable
{
    public Object Clone()
    {
        return MemberwiseClone();
    }
}

举个简单的实例

using System;
using System.Collections.Generic;
using System.Text;

namespace Chapter6
{
    class refClass
    {
        public int x;
    }
    class A:ICloneable
    {
        public refClass c=new refClass();
        public int y;
        public Object Clone()
        {
            return MemberwiseClone();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A();
            A a2 = new A();
            a1.y = 10;
            a1.c.x = 5;
            a2 = a1.Clone() as A;

            Console.WriteLine("a1信息,a1.y:{0},a1.refClass.x{1}",a1.y,a1.c.x);
            Console.WriteLine("a2信息,a2.y:{0},a2.refClass.x{1}", a2.y, a2.c.x);
            Console.WriteLine("修改a1的y和refClass.x后");
            a1.y++;
            a1.c.x++;
            Console.WriteLine("a1信息,a1.y:{0},a1.refClass.x{1}", a1.y, a1.c.x);
            Console.WriteLine("a2信息,a2.y:{0},a2.refClass.x{1}", a2.y, a2.c.x);

            Console.ReadKey();
        }
    }
}

结果如下:



为什么修改后的a1.refClass.x 和a2.refClass.x的值一样呢。因为a1的refClass为引用类型,在科隆成a2的时候,a2和a1实际是指向同一块地方。所以,他们的值会同步变化。



深拷贝 往往需要自己定制。
Class MyClass:ICloneable
{
    public Object Clone()
    {
        return 自定义对象;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值