C#面向程序设计---对象的复制

浅复制

1.浅复制是创建一个新对象,并复制原始对象中所有非静态值类型成员和所有引用类型成员的引用,
2.浅复制是通过调用object类的非静态方法MemberwiseClone实现的,该方法创建一个新对象,
然后将当前对象的非静态字段赋值到该新对象。如果字段是值类型的,则对该字段执行逐位赋值;
如果字段是引用各类型的,则赋值引用但不复制引用的对象。

实例:
Tel是一个电话类,Person是一个人员类,它有一个Tel类对象的字段tel,属于引用类型,ShallowCopy方法通过调用 object类MemberwiseClone()方法返回当前Person对象的复制对象。程序的执行结果可以看到,由p2复制到p2采用的是浅复制,两者指向不同的Person实例,而p1.tel和p2.tel总是指向Tel类的同一实例,p2.tel修改了,p1.tel也同步发生了改变。

using System;
using System.Globalization;

namespace ConsoleApp1
{
    public class Tel
    {
        public long telno;
        public Tel (long telno)
        {
            this.telno = telno;
        }     
    }
    public class Person
    {
        public int id;
        public string name;
        public Tel tel;
        public Person ShallowCopy()
        {
            return (Person)this.MemberwiseClone();
        }
        public void display()
        {
            Console.WriteLine("编号{0},姓名{1},电话{2}", id, name, tel.telno);
        }
    }
    class Mainlss
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.id = 101;p1.name = "Mary";p1.tel = new Tel(17737898301);
            Console.Write("p1:");
            p1.display();
            Console.WriteLine("由p1复制到p2");
            Person p2 = (Person)p1.ShallowCopy();
            Console.WriteLine("p1和p2是否指向同一实例:{0}", object.ReferenceEquals(p1,p2));
            Console.Write("p2:");p2.display();
            
            Console.WriteLine("修改p2的信息");
            p2.id = 820;p2.name = "Smith";p2.tel.telno = 623452;
            Console.Write("p1:");p1.display();
            Console.Write("p2:"); p2.display();
            Console.ReadKey();
        }
    }
   
}

运行结果

p1:编号101,姓名Mary,电话17737898301
由p1复制到p2
p1和p2是否指向同一实例:False
p2:编号101,姓名Mary,电话17737898301
修改p2的信息
p1:编号101,姓名Mary,电话623452
p2:编号820,姓名Smith,电话623452

深复制

深复制和浅复制的区别是对于对象引用成员的处理不同。深复制要在新对象中创建一个与原始对象中对应字段相同的虚拟字段,此引用和原始的引用是不同的。

在这里插入图片描述
在这里插入图片描述
在Person类的深复制方法DeepCopy中位Person的引用类型的字段tel重新创建了一个Tel实例,着用在Main放啊发中p1.tel
和p2.tel指向不同的Tel实例,两者相互独立

运行结果

p1:编号101,姓名Mary,电话17737898301
由p1复制到p2
p1和p2是否指向同一实例:False
p2:编号101,姓名Mary,电话17737898301
修改p2的信息
p1:编号101,姓名Mary,电话17737898301
p2:编号820,姓名Smith,电话623452
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素心如月桠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值