.net研究之对象复制

 对象复制
1.浅复制
  只复制值类型成员,称之为浅复制。
  对于引用成员,只是复制其的引用地址,所以被复制对象的引用成员和复制对象的引用成员的引用地址相同,指向了同一个对象
  在object类中有一个MemberwiseClone方法实现了浅复制
  protected Object MemberwiseClone()
  由于是受保护的,所以要在实现类中提供一个公开方法去调用MemberwiseClone。
 
 
  例如:
  class Order
    {
        public int id = 0;
        public Car car = new Car();

        public Order Clone()
        {
            return this.MemberwiseClone() as Order;
        }
    }
 
  class Car
    {
        private int sortId;

        public int SortId
        {
            get { return sortId; }
            set { sortId = value; }
        }
    }
 
  static void Main()
  {
   //说明
   //值成员的值改变不会影响另一个对象,
   //被复制对象的引用成员里面的成员值改变,复制对象的引用成员也会受到影响,
   //因为它们的引用成员所指向的是同一个对象。
   //而深复制则要为引用成员创建新的实例,这样就不会指向同一个对象。
  
    Order o1 = new Order();
    o1.id = 12;
    o1.car.SortId = 44;
   
    Order o2 = o1.Clone();
    o2.id = 24;
    o2.car.SortId = 111;
   
    MessageBox.Show(o1.id.ToString()); //o1.id is 12
    MessageBox.Show(o1.car.SortId.ToString()); //o1.car.SorgId is 111
   
    MessageBox.Show(o2.id.ToString()); //o1.id is 24
    MessageBox.Show(o2.car.SortId.ToString()); //o1.car.SorgId is 111
  }


2.深复制
  由于被复制的对象的引用成员的改变会对原始对象造成影响,所以一般要进行深复制。
  深复制不仅仅复制值成员,还要为引用成员创建新的实例,也就是说原始对象的引用成员和被复制对象的
  引用成员将不再指向同一个对象。
 
  示例:
  class Order
    {
        public int id = 0;
        public Car car = new Car();

        public Order Clone()
        {
            Order clone = new Order();
            clone.id = this.id;

            clone.car = new Car();
            clone.car.SortId = this.car.SortId;

            return clone;
        }
    }

    class Car
    {
        private int sortId;

        public int SortId
        {
            get { return sortId; }
            set { sortId = value; }
        }
    }
   
    static void Main()
    {
    //说明
    被复制对象o2的引用成员car的成员值改变将不会影响到原始成员o1
   
     Order o1 = new Order();
     o1.id = 12;
     o1.car.SortId = 44;
    
     Order o2 = o1.Clone();
     o2.id = 24;
     o2.car.SortId = 111;
    
     MessageBox.Show(o1.id.ToString()); //o1.id is 12
     MessageBox.Show(o1.car.SortId.ToString()); //o1.car.SorgId is 44
    
     MessageBox.Show(o2.id.ToString()); //o1.id is 24
     MessageBox.Show(o2.car.SortId.ToString()); //o1.car.SorgId is 111
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值