c#对象拷贝

今天研究了一下c#对象的赋值问题,特此总结,欢迎批评指正。


值类型变量的赋值很简单,下面所讲皆为引用类型变量。

1、等号(=)赋值:对象的赋值操作相当于引用;

2、浅拷贝:只拷贝基本类型,对象中的对象等资源不会被拷贝。在c#中通过继承接口ICloneable并手动实现其Clone方法,使用Object类MemberwiseClone实现

3、深拷贝:在内存中重新开辟一片空间,复制和源对象完全相同的数据进来,和源对象完全独立,互不影响。可以自定义处理,也可以通过ICloneable接口实现。


下面是自己写的测试列子

    public class Car
    {
        public Car(int price, string color)
        {
            this._price = price;
            this._color = color;
        }
        public Car(Car a)
        {
            this._color = a._color;
            this._price = a._price;
        }
        public void SetPrice(int newPrice)
        {
            _price = newPrice;
        }

        public int GetPrice()
        {
            return _price;
        }
        int _price;
        string _color;
    }

    public class Person : ICloneable 
    {
        public Person(int age, string name, Car car)
        {
            this._age = age;
            this._name = name;
            this._car = new Car(car);
        }

        public Person(Person p)
        {
            this._age = p._age;
            this._name = p._name;
            this._car = new Car(p._car);
        }

        public void SetAge(int age)
        {
            _age = age;
        }

        public int GetAge()
        {
            return _age;
        }

        public object Clone()
        {
            return this.MemberwiseClone();
        }

        int _age;
        string _name;
        public Car _car;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Car bmw = new Car(680000, "black");
            Person zhangsan = new Person(18, "zhangsan", bmw);

            // 深拷贝,是完全不用于原来的对象的新对象,任意修改不会改变原对象的值
            Person zhaoliu = new Person(zhangsan);
            zhaoliu._car.SetPrice(1000000);
            Console.WriteLine("zhaoliu deepclone zhangsan, car price: " + zhaoliu._car.GetPrice());
            Console.WriteLine("zhangsan car price: " + zhangsan._car.GetPrice());

            // 浅拷贝,对象中的对象不能被复制,依然是引用状态,修改其会导致原对象中的对象被修改
            Person wangwu = (Person)zhangsan.Clone();
            wangwu._car.SetPrice(180000);
            // 但是基本类型的值是被拷贝的,和原对象不同
            wangwu.SetAge(68);
            // 对象中的对象值被修改
            Console.WriteLine("wangwu wiseclone zhangsan, car price: " + wangwu._car.GetPrice());
            Console.WriteLine("zhangsan car price: " + zhangsan._car.GetPrice());
            
            // 原对象的基本类型的值未被修改
            Console.WriteLine("wangwu age: " + wangwu.GetAge());
            Console.WriteLine("zhangsan age: " + zhangsan.GetAge());

            // “=” 赋值相当于引用
            Person lisi = zhangsan;
            lisi.SetAge(22);

            Console.WriteLine("lisi age:" + lisi.GetAge());
            Console.WriteLine("zhangsan age: " + zhangsan.GetAge());
<span style="white-space:pre">	</span>}
    }

结果:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值