关于.net中MemberwiseClone()的学习

举报
王阿毛 发表于 2019/09/14 17:21:47 2019/09/14
【摘要】 最近在恶补理论知识,在看到设计模式中的原型模式的时候中间一篇文章提到了一个叫做MemberwiseClone的方法,好奇之下搜了一下,官方文档的解释和示例链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.object.memberwiseclone?redirectedfrom=MSDN&view=netframework-4.8#S...

最近在恶补理论知识,在看到设计模式中的原型模式的时候中间一篇文章提到了一个叫做MemberwiseClone的方法,好奇之下搜了一下,官方文档的解释和示例链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.object.memberwiseclone?redirectedfrom=MSDN&view=netframework-4.8#System_Object_MemberwiseClone

从而引申出来了浅复制和深度复制,具体名词什么意思我就不解释了。

在学习的过程中我产生了一个疑问,就是在进行浅复制的时候,它的作用和 “=”有什么区别,在查询了相关资料和经过自己的思考过后,总结如下,有什么问题欢迎大家指正:

"="属于引用拷贝,"MemberwiseClone"属于浅复制。

举例如下:

person p1 = new person();

p2 = p1;

此时是将p2的引用地址指向了p1的引用地址。因此修改p1内成员变量的值,p2也会跟着变化,p1怎么变化p2跟着怎么变化。

MemberwiseClone根据官网的描述,复制的规则如下:

如果字段是值类型,则执行字段的逐位副本。 如果字段是引用类型,则会复制引用,但不会复制引用的对象;因此,原始对象及其复本引用相同的对象。

当我们需要拷贝的对象里既有数值类型也有引用类型的字段时,对于引用类型的字段使用Memberwiseclone只复制了其内存的地址,此时我们修改拷贝对象内引用类型字段内的数据时,新的对象内对应的数据也随之变化。


具体测试代码如下:

     public class Class1
    {
        public void Testcode1()
        {
            var person = new PersonModel("person");
            person.Age = 43;
            person.Name = "lixianghe";
            person.IdInfo = new IdInfo("123");
            person.print();
            var p2 = person;
            PersonModel p3 = person.ShallowCopy();
            p2.print();
            person.Age = 333;
            person.Name = "wangxing";
            person.IdInfo.IdNo = "1234";
            person.print();
            p2.print();
            p3.print();

        }
        public class PersonModel
        {
            private string classname { get; set; }
            public PersonModel(string name)
            {
                classname = name;
            }
            public int Age { get; set; }
            public string Name { get; set; }
            public IdInfo IdInfo { get; set; }

            public PersonModel ShallowCopy()
            {
                return (PersonModel)this.MemberwiseClone();
            }
            public void print()
            {
                Console.WriteLine($"==============={classname}=================");
                Console.WriteLine("Name: " + Name);
                Console.WriteLine("Age: " + Age);
                Console.WriteLine("Idinfo: " + IdInfo.IdNo);

                //Console.WriteLine("Name: " + Name);
            }
            public PersonModel DeepCopy()
            {
                PersonModel other = (PersonModel)this.MemberwiseClone();
                other.IdInfo = new IdInfo(IdInfo.IdNo);
                other.Age = this.Age;
                other.Name = String.Copy(this.Name);
                return other;
            }

        }

        public class IdInfo
        {
            public IdInfo(string idno)
            {
                IdNo = idno;
            }

            public string IdNo { get; set; }

        }
    }

输出结果如下:

Hello World!

===============person=================

Name: lixianghe

Age: 43

Idinfo: 123

===============person=================

Name: lixianghe

Age: 43

Idinfo: 123

===============person=================

Name: wangxing

Age: 333

Idinfo: 1234

===============person=================

Name: wangxing

Age: 333

Idinfo: 1234

===============person=================

Name: lixianghe

Age: 43

Idinfo: 1234


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200