C#实现复制和深度复制的方法详解


本文摘自PHP中文网,作者黄舟,侵删。

下面小编就为大家带来一篇C#复制和深度复制的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

class Program

 {

   [Serializable]

   public class Car

   {

     public string name;

     public Car(string name)

     {

       this.name = name;

     }

   }

   [Serializable]

   public class Person:ICloneable

   {

     public int id;

     public string name;

     public Car car;

     public Person()

     {

     }

     public Person(int id, string name, Car car)

     {

       this.id = id;

       this.name = name;

       this.car = car;

     }

 

     public Object Clone() //实现ICloneable接口,达到浅表复制。浅表复制与深度复制无直接有关系。 对外提供一个创建自身的浅表副本的能力

     {

       return this.MemberwiseClone();

     }

 

   }

 

   //要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性。

   public static T Copy<T>(T RealObject)

   {

     using (Stream objectStream = new MemoryStream())

     {

       //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制 

       IFormatter formatter = new BinaryFormatter();

       formatter.Serialize(objectStream, RealObject);

       objectStream.Seek(0, SeekOrigin.Begin);

       return (T)formatter.Deserialize(objectStream);

     }

   

 

   

   static void Main(string[] args)

   {

     Person p1 = new Person(1, "Scott", new Car("宝马"));

     Console.WriteLine("原始值:P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);

     Person p2 = Copy<Person>(p1); //克隆一个对象

     Person p3 = p1.Clone() as Person;//浅表复制

     Console.WriteLine("改变P1的值");

     p1.id = 2;

     p1.name = "Lacy";

     p1.car.name = "红旗";

     Console.WriteLine("P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);

     Console.WriteLine("深度复制:P2:id={0}----------->name={1}------>car={2}", p2.id, p2.name, p2.car.name);

     Console.WriteLine("浅表复制:P3:id={0}----------->name={1}------>car={2}", p3.id, p3.name, p3.car.name);

     Console.ReadKey();

 

   }

运行结果:

阅读剩余部分

相关阅读 >>

C#实现base64处理的加密解密,编码解码的示例代码

C# 应用npoi获取excel中的图片,保存至本地的算法的图文代码实例详解

分享125个基本的C#面试问答

C#因其保护级别而不可访问,只能处理公共类型的详细代码介绍

C# 实现 cachehelper

详细介绍C#win32控制台线程计时器代码示例

C#控制台应用程序中如何输出彩色字体的详细介绍

C#教程】C# 枚举(enum)

C#学习记录:编写高质量代码改善整理建议1-3

详细介绍C#消息提示框messagebox的使用

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...