C#中如何对数组进行深复制

  在复习C#的一些基本知识点,看到数组这节时想到对进行数组进行复制这问题,然后发现.Net Framework中没有提供对深复制的原生API支持,参考了书的提示,发现可以用“序列化/反序列化”来实现对数组的深复制。
  首先分别什么是浅复制以及深复制:

  浅复制:将原来对象中的所有字段逐个复制到一个新对象,如果字段是值类型,刚只是简单地复制一个副本到新对象,改变新对象的值类型字段不会影响原对象,如果字段是引用类型,则复制的是引用,改变目标对象中引用类型字段的值将会影响原对象。

  深复制:与浅复制不同之处在于对引用类型的处理,深复制将会在新对象中创建引用类型字段引用的所有对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。


  除了对数组进行浅复制和深复制,其他Object对象也可以进行浅复制和深复制,这里讨论数组的深复制,也是解决其他对象深复制的思路之一。
  对数组执行浅复制有两种方法,一种是使用CopyTo,另一种是使用Clone,这两个方法都属于实例方法,其中Clone方法继承System.Object对象,返回一个新的对象,不过需要显式类型转换。CopyTo方法可以将一个一维数组的所有元素复制到一个已有的数组实例,这是与Clone方法之间的一个重要区别。

  对数组进行浅复制比较容易理解,下面讨论下用“序列化/反序列化”的方式实现对数组的深复制。
  下面是网上对序列化及反序列化的介绍:C#序列化和反序列化,两者的程序处理方式基本一致,都是基于工厂模式的,所谓C#序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件中。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。相反的,反序列化根据流重新构造对象。.NET自带的有两种序列化对象的方式,Xml和binary的,XML 序列化不转换方法、索引器、私有字段或只读属性(只读集合除外)。要序列化对象的所有字段和属性(公共的和私有的),请使用 BinaryFormatter,而不要使用 XML 序列化。
  然后还有遍感觉挺详细的博文:http://www.cnblogs.com/qqflying/archive/2008/01/13/1037262.html

  用序列化/反序列化实现对数组的深复制代码如下:
  

View Code
   
     
1 using System;
2 using System.IO;
3 using System.Runtime.Serialization.Formatters.Binary;
4
5 namespace ArraySample
6 {
7 [Serializable] // 标识Number类为可序列化
8 class Number
9 {
10 public int Num{ get ; set ;}
11 public override string ToString()
12 {
13 return string .Format( " 数值为:{0} " ,Num);
14 }
15
16 }
17
18 class CopySample
19 {
20 public static void PrintArray(Number [] Numbers)
21 {
22 foreach (Number number in Numbers)
23 {
24 Console.WriteLine(number);
25 }
26 Console.WriteLine();
27 }
28
29
30 public static void Main( string [] args)
31 {
32 Number[] array1 = new Number[ 4 ];
33 int [] array2 = new int [ 4 ]{ 1 , 2 , 3 , 4 };
34 for ( int i = 0 ;i < array1.Length;i ++ )
35 {
36 array1[i] = new Number{Num = 10 * (i + 1 )};
37 }
38 Console.WriteLine( " 数组array1的元素: " );
39 PrintArray(array1);
40
41 MemoryStream ms = new MemoryStream(); // 序列化
42 BinaryFormatter bf = new BinaryFormatter();
43 bf.Serialize(ms,array1);
44 ms.Position = 0 ;
45
46 Number[] array3 = (Number[])bf.Deserialize(ms); // 反序列化
47 for ( int i = 0 ;i < array3.Length;i ++ )
48 {
49 array3[i].Num = 20 * (i + 1 );
50 }
51 Console.WriteLine( " 对数组array3进行重新赋值后array3的元素: " );
52 PrintArray(array3);
53 Console.WriteLine( " 对数组array3进行重新赋值后array1的元素: " );
54 PrintArray(array1);
55
56 Console.Write( " Press any key to continue . . . " );
57 Console.ReadKey( true );
58 }
59
60 }
61 }

你可能感兴趣的:(C#)