关于.net中MemberwiseClone()的学习
【摘要】 最近在恶补理论知识,在看到设计模式中的原型模式的时候中间一篇文章提到了一个叫做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)