浅拷贝MemberwiseClone()

/Object类只有MemberwiseClone
调用了就已经产生了一个新对象了,这是浅复制
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制
/
在这里插入图片描述
/MemberWiseClone()是System.Object包含的其中一个方法。因为所有的类都继承于System.Object,
所以这些类都可以访问System.Object中受保护的成员
包括MemberWiseClone()方法;在MyCopyableClass类中定义的GetCopy()方法,也叫浅度复制
它是通过创建一个新对象并复制成员,也就复制了该对象
/

using System;
using static System.Console;

namespace MemberClone
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1=new Person();
            p1.Age = 20;
            p1.Name = "一休";
            p1.idInfo=new IdInfo(666);

            Person p2=p1.ShallowCopy(); //P2中的Age 和 Name 相对于 P1是全新的,但P2中的 IdInfo 和 P1中的 IdInfo 是同一个对象,二者同在一个内存地址!
            WriteLine(p2.Age+":"+p2.Name+":"+p2.idInfo.IdNumber);

            ReadKey();
        }
    }

    public class IdInfo
    {
        public int IdNumber;

        public IdInfo(int idNumber)
        {
            this.IdNumber = idNumber;
        }
    }

    public class Person
    {
        public int Age;
        public string Name;
        public IdInfo idInfo;

        //浅拷贝
        public Person ShallowCopy()
        {
            return (Person)this.MemberwiseClone();
        }

    } 

}

在这里插入图片描述

当通过MemberwiseClone调用方法克隆对象时,克隆Person的对象是原始对象的独立副本,只不过它们共享相同Person.IdInfo的对象引用。 因此,修改克隆的Person.IdInfo属性会更改原始对象的Person.IdInfo属性。 另一方面,执行深层复制操作时,可以修改克隆Person的对象(包括其Person.IdInfo属性),而不会影响原始对象。

MemberwiseClone方法创建一个浅表副本,方法是创建一个新的对象,然后将当前对象的非静态字段复制到新的对象。 如果字段是值类型,则执行字段的逐位副本。 如果字段是引用类型,则会复制引用,但不会复制引用的对象;因此,原始对象及其复本引用相同的对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值