热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Object.MemberwiseClone(浅Clone、深Clone)

MemberwiseClone方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则

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

 

例如,考虑引用对象 A 和 B 的被称为 X 的对象。 对象 B 依次引用对象 C。 X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B。 相比而言,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2 和 B2(分别为 A 和 B 的副本)。 B2 又引用新对象 C2,C2 是 C 的副本。 该示例阐释了浅层和深层复制操作之间的区别。

有很多方法可以实现深层复制操作,前提是浅表复制操作由 MemberwiseClone 方法执行但不符合您的需求。 这些要求包括:

  • 调用要复制的对象的类构造函数以创建含有从第一个对象中提出的属性值的第二个对象。 这假定对象的值完全由类构造函数定义。

  • 调用 MemberwiseClone 方法创建的对象的浅表副本,然后将指定新的对象,其值均相同,原始对象的任何属性或字段的值是引用类型。 该示例中的 DeepCopy 方法阐释了这种方法。

  • 序列化要深层复制的对象,然后将序列化的数据还原到另一个对象变量。

  • 使用带递归的反射执行的深层复制操作。

      1 using System;
      2 
      3 public class IdInfo
      4 {
      5     public int IdNumber;
      6 
      7     public IdInfo(int IdNumber)
      8     {
      9         this.IdNumber = IdNumber;
     10     }
     11 }
     12 
     13 public class Person 
     14 {
     15     public int Age;
     16     public string Name;
     17     public IdInfo IdInfo;
     18 
     19     public Person ShallowCopy()
     20     {
     21        return (Person)this.MemberwiseClone();
     22     }
     23 
     24     public Person DeepCopy()
     25     {
     26        Person other = (Person) this.MemberwiseClone(); 
     27        other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
     28        return other;
     29     }
     30 }
     31 
     32 public class Example
     33 {
     34     public static void Main()
     35     {
     36         // Create an instance of Person and assign values to its fields.
     37         Person p1 = new Person();
     38         p1.Age = 42;
     39         p1.Name = "Sam";
     40         p1.IdInfo = new IdInfo(6565);
     41 
     42         // Perform a shallow copy of p1 and assign it to p2.
     43         Person p2 = (Person) p1.ShallowCopy();
     44 
     45         // Display values of p1, p2
     46         Console.WriteLine("Original values of p1 and p2:");
     47         Console.WriteLine("   p1 instance values: ");
     48         DisplayValues(p1);
     49         Console.WriteLine("   p2 instance values:");
     50         DisplayValues(p2);
     51 
     52         // Change the value of p1 properties and display the values of p1 and p2.
     53         p1.Age = 32;
     54         p1.Name = "Frank";
     55         p1.IdInfo.IdNumber = 7878;
     56         Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
     57         Console.WriteLine("   p1 instance values: ");
     58         DisplayValues(p1);
     59         Console.WriteLine("   p2 instance values:");
     60         DisplayValues(p2);
     61 
     62         // Make a deep copy of p1 and assign it to p3.
     63         Person p3 = p1.DeepCopy();
     64         // Change the members of the p1 class to new values to show the deep copy.
     65         p1.Name = "George";
     66         p1.Age = 39;
     67         p1.IdInfo.IdNumber = 8641;
     68         Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
     69         Console.WriteLine("   p1 instance values: ");
     70         DisplayValues(p1);
     71         Console.WriteLine("   p3 instance values:");
     72         DisplayValues(p3);
     73     }
     74 
     75     public static void DisplayValues(Person p)
     76     {
     77         Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
     78         Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
     79     }
     80 }
     81 // The example displays the following output:
     82 //       Original values of p1 and p2:
     83 //          p1 instance values:
     84 //             Name: Sam, Age: 42
     85 //             Value: 6565
     86 //          p2 instance values:
     87 //             Name: Sam, Age: 42
     88 //             Value: 6565
     89 //       
     90 //       Values of p1 and p2 after changes to p1:
     91 //          p1 instance values:
     92 //             Name: Frank, Age: 32
     93 //             Value: 7878
     94 //          p2 instance values:
     95 //             Name: Sam, Age: 42
     96 //             Value: 7878
     97 //       
     98 //       Values of p1 and p3 after changes to p1:
     99 //          p1 instance values:
    100 //             Name: George, Age: 39
    101 //             Value: 8641
    102 //          p3 instance values:
    103 //             Name: Frank, Age: 32
    104 //             Value: 7878

转:https://www.cnblogs.com/hawk0450/archive/2012/03/14/2396028.html



推荐阅读
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文介绍如何在PostgreSQL数据库中正确插入和处理JSON数据类型,确保数据完整性和避免常见错误。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
author-avatar
finaokas_261
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有