关于.net中MemberwiseClone()的学习
最近在恶补理论知识,在看到设计模式中的原型模式的时候中间一篇文章提到了一个叫做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
- 点赞
- 收藏
- 关注作者
评论(0)