zoukankan      html  css  js  c++  java
  • 深复制与浅复制的实现

      在使用System.Object的方法中有一个受保护的方法object MemberwiseClone(),这个方法实现了对象的复制,事实上,它所实现的就是浅复制。

      所谓的浅复制,是指复制一个对象的时候,复制原始对象所有的非静态值类型成员和所有的引用类型成员的引用。新的对象和原始对象将共享所有的引用类型成员的实际对象。而深复制是指不仅复制所有的非静态值类型成员,而且复制所有引用类型成员的实际对象。

      类型基类System.Object已经为所有类型都实现了浅复制,类型所要做的就是公开一个复制的接口,而通常的,这个接口会借由实现ICloneable接口来实现。ICloneable只包含一个方法Clone。该方法既可以被实现为浅复制也可以被实现为深复制,具体如何取舍需要根据具体类型的需求来决定:

    View Code
     1 /* 
     2  * 功能:浅复制与深复制示例
     3  * 作者:鲍昊晟
     4  * 日期:2013/3/18
     5  */
     6 using System;
     7 using System.IO;
     8 using System.Runtime.Serialization.Formatters.Binary;
     9 
    10 namespace CloneDemo
    11 {
    12     class Program
    13     {
    14         static void Main(string[] args)
    15         {
    16             ShallowCopy();
    17             Console.WriteLine();
    18             DeepCopy();
    19 
    20             Console.ReadKey();
    21         }
    22 
    23         private static void ShallowCopy()
    24         {
    25             Console.WriteLine("浅复制示例:");
    26             Person p1 = new Person() { Name = "张三", Car = new Car() { Name = "宝马" } };
    27             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
    28             Console.WriteLine("浅复制并修改");
    29             Person p2 = p1.MemberwiseClone() as Person;
    30             p2.Name = "李四";
    31             p2.Car.Name = "奔驰";
    32             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
    33             Console.WriteLine("Name:{0},Car:{1}", p2.Name, p2.Car);
    34         }
    35 
    36         private static void DeepCopy()
    37         {
    38             Console.WriteLine("深复制示例:");
    39             Person p1 = new Person() { Name = "张三", Car = new Car() { Name = "宝马" } };
    40             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
    41             Console.WriteLine("深复制并修改");
    42             Person p2 = p1.Clone() as Person;
    43             p2.Name = "李四";
    44             p2.Car.Name = "奔驰";
    45             Console.WriteLine("Name:{0},Car:{1}", p1.Name, p1.Car);
    46             Console.WriteLine("Name:{0},Car:{1}", p2.Name, p2.Car);
    47         }
    48     }
    49 
    50 
    51     [Serializable]
    52     public class Car
    53     {
    54         public string Name;
    55         public override string ToString()
    56         {
    57             return Name;
    58         }
    59     }
    60 
    61     [Serializable]
    62     public class Person : ICloneable
    63     {
    64         public string Name;
    65 
    66         public Car Car;
    67 
    68         /// <summary>
    69         /// 创建当前对象的浅表副本
    70         /// </summary>
    71         /// <returns></returns>
    72         public new object MemberwiseClone()
    73         {
    74             return base.MemberwiseClone();
    75         }
    76 
    77         #region ICloneable 成员
    78         /// <summary>
    79         /// 深复制
    80         /// </summary>
    81         /// <returns></returns>
    82         public object Clone()
    83         {
    84             BinaryFormatter formatter = new BinaryFormatter();
    85             MemoryStream stream = new MemoryStream();
    86             formatter.Serialize(stream, this);
    87             stream.Seek(0, SeekOrigin.Begin);
    88             return formatter.Deserialize(stream);
    89         }
    90         #endregion
    91     }
    92 
    93 }
  • 相关阅读:
    数据结构与算法(一)--数组
    Lucene学习
    java虚拟机面试题(JVM)
    Java开发面试题归类( 题目篇)
    java虚拟机学习(六)
    java虚拟机学习(五)--垃圾收集器总结
    21_异常_第21天(异常、企业面试题,思维导图下载)
    20_集合_第20天(Map、可变参数、Collections)
    19_集合_第19天(List、Set)
    18_集合框架_第18天(集合、Iterator迭代器、增强for循环 、泛型)
  • 原文地址:https://www.cnblogs.com/lucienbao/p/Clone.html
Copyright © 2011-2022 走看看