您的位置:首页 > 编程语言 > C#

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

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

  浅复制:将原来对象中的所有字段逐个复制到一个新对象,如果字段是值类型,刚只是简单地复制一个副本到新对象,改变新对象的值类型字段不会影响原对象,如果字段是引用类型,则复制的是引用,改变目标对象中引用类型字段的值将会影响原对象。
  深复制:与浅复制不同之处在于对引用类型的处理,深复制将会在新对象中创建引用类型字段引用的所有对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。


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

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

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

View Code

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ArraySample
{
[Serializable]   //标识Number类为可序列化
class Number
{
public int Num{get;set;}
public override string ToString()
{
return string.Format("数值为:{0}",Num);
}

}

class CopySample
{
public static void PrintArray(Number [] Numbers)
{
foreach(Number number in Numbers)
{
Console.WriteLine(number);
}
Console.WriteLine();
}

public static void Main(string[] args)
{
Number[] array1 = new Number[4];
int[] array2 = new int[4]{1,2,3,4};
for(int i=0;i<array1.Length;i++)
{
array1[i] = new Number{Num = 10 *(i+1)};
}
Console.WriteLine("数组array1的元素:");
PrintArray(array1);

MemoryStream ms = new MemoryStream();//序列化
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms,array1);
ms.Position = 0;

Number[] array3 = (Number[])bf.Deserialize(ms);  //反序列化
for(int i = 0;i<array3.Length;i++)
{
array3[i].Num=20 *(i+1);
}
Console.WriteLine("对数组array3进行重新赋值后array3的元素:");
PrintArray(array3);
Console.WriteLine("对数组array3进行重新赋值后array1的元素:");
PrintArray(array1);

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: