C# 深浅复制 MemberwiseClone
2021-03-02 15:26
标签:ons span 执行 内存地址 会同 相对 克隆 代码分析 ret 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考MSDN: https://group.jd.com/thread/20000001/26285684/20000004.htm 所谓深浅复制可解读为: 浅复制:在C#中调用 MemberwiseClone() 方法即为浅复制。如果字段是值类型的,则对字段执行逐位复制,如果字段是引用类型的,则复制对象的引用,而不复制对象,因此:原始对象和其副本引用同一个对象! 深复制:如果字段是值类型的,则对字段执行逐位复制,如果字段是引用类型的,则把引用类型的对象指向一个全新的对象! 上述的解释可能看不太懂,我们作如下案例进行分析: 上述代码分析如下: 原始对象P1,通过浅复制得到对象P2,通过深复制得到P3 原始对象P1中的值类型属性有:Age 和 Name ,引用类型对象有:IdInfo 根据上述浅复制的概念可知:P2中的Age 和 Name 相对于 P1是全新的,但P2中的 IdInfo 和 P1中的 IdInfo 是同一个对象,二者同在一个内存地址! 根据上述深复制的概念可知:P3中的Age 和 Name 相对于 P1是全新的,但P3中的 IdInfo 和 P1中的 IdInfo 不是同一个对象,也就是说 P3中的IdInfo是一个全新的对象,开辟了自己的内存地址! 上述代码测试如下: 我们现在讲代码修改如下: 在输出P2之前,我们修改了P1对象的值类型Name 和 引用类型 IdInfo 。 无论是浅复制还是深复制,副本中的值类型都是全新的! 浅复制中原始对象和副本的引用类型指向同一内存地址,所以,修改了P1的IdInfo会同时影响P2的IdInfo 输出如下: 继续修改代码,如下: 深复制中原始对象和副本的引用类型指向各自的地址,两者完全是两个不同的对象! 因此:修改P1不会影响P3 so,是不是很简单,是不是很Easy. 深浅复制主要用于当创建一个对象需要消耗过多资源时,可以采取复制的方法提升效率! 大话设计模式的原话是这样滴:当你New一个对象时,每New一次,都需要执行一个构造函数,如果构造函数的执行时间很长,那么多次New对象时会大大拉低程序执行效率,因此:一般在初始化信息不发生变化的前提下,克隆是最好的办法,这既隐藏了对象的创建细节,又大大提升了性能! 当然,如果每个类都要写自己的深复制,这岂不是非常非常麻烦,因此,有一个通用的深复制方法,如下: C# 深浅复制 MemberwiseClone 标签:ons span 执行 内存地址 会同 相对 克隆 代码分析 ret 原文地址:https://www.cnblogs.com/bei0by/p/13045440.html public static void Main()
{
//创建P1对象
Person p1 = new Person();
p1.Age = 42;
p1.Name = "Sam";
p1.IdInfo = new IdInfo("081309207");
//通过浅复制 得到P2对象
Person p2 = p1.ShallowCopy();
//分别输出
Console.WriteLine("对象P1相关属性如下");
DisplayValues(p1);
p1.Name = "浅复制中,修改了P1的Name属性,但Name是值类型,所以不会影响P2";
p1.IdInfo.IdNumber = "浅复制中,修改了P1的IdInfo属性,但IdInfo是引用类型,所以会影响P2 (浅复制中引用类型原始对象和副本指向同一内存地址)";
Console.WriteLine("对象P2相关属性如下");
DisplayValues(p2);
Console.Read();
}
public static void Main()
{
//创建P1对象
Person p1 = new Person();
p1.Age = 42;
p1.Name = "Sam";
p1.IdInfo = new IdInfo("081309207");
//现在测试深复制
Person p3 = p1.DeepCopy();
p1.Name = "George";
p1.Age = 39;
p1.IdInfo.IdNumber = "081309208";
Console.WriteLine("对象P1相关属性如下");
DisplayValues(p1);
p1.IdInfo.IdNumber = "深复制中,修改了P1的IdInfo属性,即使IdInfo是引用类型,也不会影响P3 (深复制中引用类型原始对象和副本分别指向不同的内存地址)";
Console.WriteLine("对象P3相关属性如下");
DisplayValues(p3);
Console.Read();
}
///
文章标题:C# 深浅复制 MemberwiseClone
文章链接:http://soscw.com/index.php/essay/59088.html